═══ 1. lxLite User's Guide ═══ Dedicated to my little daughter Alice, born 12 Feb, 1996 at 03:45. Distribution Starting from version 1.1.9 I at last decided (really I at last realized what it really is :-) ) to distribute lxLite under GNU General Public License (GPL). The program is written exclusively using Virtual Pascal, with use of its built-in 32-bit assembler. This is an excellent language which takes full advantages of OS/2`s possibilities, is BorlandPascal compatible, and have a much more powerful than BP built-in optimizer. Contents  Introduction  Features  Command-line switches  Configuration file  Error messages  Known bugs and limitations  Thanks...  lxLite Utility Pack  Author info You really should read the "what's new" section which contains many things I was too lazy to add to documentation. Also is available a German version of documentation (although in plain .TXT format, and a little out of date - for version 1.1.5). Also available a short overview in Russian (codepage 866). ──────────────────────────────────────────────────────────────────────────────── ═══ 1.1. Author info ═══ Andrew Pavel Zabolotny Born Jan, 25, 1973 in Kishinev, Moldova, I moved around `95 to St. Petersburg, Russia. I'm currently working as system programmer at the Information Security Center of I.M.I.C.S. (Institute of Modelling and Intellectualization of Complex Systems) at the St. Petersburg's State Electrotechnical University. All my spare time I`m dedicating to my family (esp. to my 1-year-old daughter Alice) and to system programming. Most (alas) of my programs I wrote for Mess-DOS, but last two years I`m trying to make familiar with the Architecture Of Real Operating Systems {tm} :-), particularily that of OS/2, and (sometimes :-) I`m writing Small But Very Useful Utilites :-) Perhaps, the most useful of them is lxLite - an OS/2 executables compressor, something like LZEXE, PKLITE etc in the world of DOS. You can find it (perhaps) on the hobbes.nmsu.edu archive in the /os2/archive subdirectory (although I do not agree with classifying lxLite as an archiver :-), it is rather a mixture of a system tool with a programming tool (since it allows to do a lot of with the structure of LX executable modules ) ──────────────────────────────────────────────────────────────────────────────── To contact me, please write to bit@freya.etu.ru or you can return to title page ═══ 1.2. GNU General Public License ═══ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ═══ 1.3. Known bugs and limitations ═══ Known bugs and limitations Here are a list of executables which failed for some reasons to work packed; avoid packing them (lxLite will do it automatically, but if you renamed them lxLite will not recognize them).  PMJPEG v1.5. However, even IBM`s REPACK cannot repack it, so I think this is because of either a bug in a linker used to generate it (and its executable has a strange structure) or a kind of debug protection (executable checksum checking?)  VX-REXX executables. The main body of such executables (REXX ciphered code) is simply appended to a small LX stub. Such executables have an unknown structure and after lxLite packs its stub they become completely obsolete.  Watcom C & C++ v>=10.0. Seems that Watcom likes to append garbage to LX files. These executables are meant for running in both OS/2 and DOS sessions and also have a strange structure. ;  InterCom since it is protected from any kind of tampering.  \OS2BOOT. OS2LDR expects OS2BOOT to be in NE format. ──────────────────────────────────────────────────────────────────────────────── Title page | Introduction | Features | Command-line switches | Configuration file | Error messages | Thanks... | Utility Pack | Author info ═══ 1.4. Configuration file ═══ Configuration file The .CFG file format is as simple as possible: it is a plain ASCII text file which you can edit using any editor which supports them (almost any). Any characters after a semicolumn ';' are ignored, i.e. you can put comments in configuration file like this: ; This is an comment You can define sections using widely used unix-configuration-file style, i.e. [section 1] section 1 content [section 2] section 2 content ... The word in square brackets is used to identify the configuration. This is an example of a configuration entry: [newStub] /ANP:0 /F+ /YDL /YXL /MRN /MLN /U- As you can see, inside the section you should put any switches just like you do on the command line. Recursive /C options are NOT ignored, so you can link one configuration to another. Note, however, that lxLite will refuse to load same configuration twice to avoid infinite-loop recursion, i.e. "lxLite /c:One /c:Two /c:One" will load `One` configuration only ONCE. Every section can have multiple names, for example: [newStub ReplaceStub SetNewStub] /ANP:0 /F+ /YDL /YXL /MRN /MLN /U- This section is identified by three identifiers, i.e. /c:newstub, /c:replacestub and /c:setnewstub switches will have same effect. If section identifier begins with a / (slash) character, it is treated as a special case: the text following the slash is treated as a list of file masks on which this section will be applied automatically. For example, if we want to remove stubs automatically on all .DLL files, we have to write a configuration section like: [/*.dll] /t /zs ──────────────────────────────────────────────────────────────────────────────── Title page | Introduction | Features | Command-line switches | Error messages | Bugs and limitations | Thanks... | Utility Pack | Author info ═══ 1.5. lxLite_de.txt ═══ ---------------------------------------------------- lxLite - ein Packer fuer ausfuehrbare OS/2-Dateien ---------------------------------------------------- Widmung: Meiner kleinen Tochter Alice, geboren am 12 Feb, 1996 um 03:45. 0. Version der deutschen Dokumentation -------------------------------------- Die deutsche Uebersetzung basiert auf der englischen Dokumentation zu lxLite 1.1.5. 1. Distribution --------------- Dieses Programm ist Freeware. Das heisst, man kann es verbreiten, wie man will, ausser fuer den kommerziellen Gebrauch. Kommerzielle Verwendung ist nur mit meiner ausdruecklichen Zustimmung erlaubt. Wie man mich kontaktieren kann ist in der letzten Sektion dieser Datei zu sehen. Freeware heisst aber auch, dass es keinerlei Garantie fuer das gibt, was das Programm macht, ob es das macht was man erwartet, ob es ueberhaupt etwas macht. Ich uebernehme keinerlei Verantwortung fuer irgendeinen Schaden, entgangene Profite etc., die durch Fehler dieses Programms (oder der Uebersetzung der Dokumentation) verursacht werden. Wie auch immer, es ist erlaubt, das Programm dazu zu verwenden, um jedes, auch jedes kommerzielle Produkt zu verbessern. Und zwar nicht um den eigenen Vorteil, sondern um den Vorteil aller armen User, die sich mit riesigen Programmdateien herumaergern muessen. Das Programm ist ausschliesslich in Virtual Pascal 1.0 Beta #003, geschrieben, vor allem mit dem eingebauten 32-bit Assembler. Virtual Pascal ist eine excellente Sprache, die alle Vorteile und Moeglichkeiten von OS/2 bedient und unterstuetzt, gleichzeitig Borland Pascal kompatibel ist, und einen maechtigen eingebauten Optimierer hat. Falls du den Source Code von lxLite willst, bitte wende Dich an mich, aber du musst mir ganz sagen WARUM du ihn brauchst; Leute, die fremde Programme unter eigenem Namen verkaufen wollen, bekommen ihn sicher nicht. 2. Einfuehrung ------------- Ich denke, wir alle sind recht sauer ueber die gewaltige Groesse die fast alle modernen Programme haben, die unter OS/2 laufen (fuer WinDOS gilt allerdings das gleiche), ohne oft entscheidend mehr zu koennen als Programme frueherer Zeiten. Ich verstehe nicht, warum sie so gross sind, weil die meisten Compiler, sogar IBM CSet generieren Code in moderaten Groessen. Nehmen wir als Beispiel das allseits bekannte MultiMaint. Was um alles in der Welt macht das Ding in einer 700K grossen EXE-Datei? Ich verstehe es nicht. Dazu kommt noch, warum wird die beinahe gleiche EXE-Datei noch doppelt und dreifach dazugepackt (Ich meine MultiSafe und IniMaint, die mit MultiMaint daherkommen). Das Programm ist ja ganz nett und es macht seine Arbeit ganz gut, aber fuer diese Arbeit ist es einfach zu gross. OS/2 Kernel haben etwa den gleichen Umfang. Wo ist da die Relation? Ich kann (und will) es mir einfach nicht leisten so einen grossen Haufen Mist auf meine Platte zu laden, also habe ich MultiMaint & Co. wieder gekuebelt. Zu Dumm fuer deren Autoren. lxLite ist ein Workaround fuer dieses Problem. Programmdateien kann man packen, sie nehmen dann nur noch den halben Platz ein, und machen noch immer den glichen Job. Dummerweise braucht es auch den gleichen Platz im Speicher - das ist die Schuld des Autors. Soviel ich weiss, gibt es fuer OS/2 nur ein Programm, das etwas Aehnliches macht REPACK von IBM (EWS?). Aber vergleichen mit lxLite erzeugt es groessere Dateien, obwohl es den gleichen Algorithmus verwendet. Zum Beispiel, COURIER.FON aus OS/2 Warp Build 8.192 wird von REPACK zu 44K, von lxLite aber in 34K gepackt. Spuer den Unterschied! BTW, LINK386+Ressource Compiler compilieren COURIER.FON auch in ein 44K-Datei. Daher denke ich, dass das sie eine gemeinsame Library verwenden. Ich komprimierte alle meine Programmdateien (inklusive aber nicht nur ?:\os2\*.exe, ?:\os2\dll\*.* und ?:\os2\dll\ibmnull;laserjet) und mein System ist nach wie vor stabil. Ein lxLite Benutzer (Pavel Roskin) hat festgestellt, dass lxLite sogar os2krnl komprimiert:-) Sehr angenehm vor allem fuer eine einzelne Bootdiskette [Anmerkung d. Uebersetzers: Es stimmt]. 3. Features ----------- lxLite komprimiert die Dateien auf die gleiche Art wie LINK386 es tut. Es gibt keine andere Moeglichkeit gepackte Programmdateien unter OS/2 zu implementieren, als die zwei, die OS/2 Warp (oder die eine die 2.x) kennt. So, hier ist eine kurze Beschreibung dieser beiden Algorithmen: 1. Run-length packing. Das ist im Prinzip die gleiche Methode, wie sie Microsoft C fuer DOS verwendet. Das Ergebnis ist sehr SCHLECHT, weils sich Programmdateien nicht fuer die Pack-Methode eignen. Zum Beispiel, PCX Dateien werden auf die gleiche Art gepackt. 2. Eine Art Lempel-Ziv Algorithmus. Lempel-Ziv ist die Methode, die beinahe alle DOS-EXE Packer verwenden - LZEXE, PKLITE, PGMPAK etc. Die Methode die fuer ausfuehrebare OS/2 Dateien standardisiert ist, ist IMHO nicht die effektivste. Dazu kommt noch, dass OS/2-Programmdateien einen anderen Ladealgorithmus haben als DOS-EXE-Dateien, Teile von OS/2-Programmdateien koennen auch nur geladen werden, wenn sie gebraucht werden. Deshalb kann ein Lempel-Ziv Woerterbuch nicht ueber eine einzelne Page (4096 Bytes) hinausgehen. Folglich sind die Resultate auch nicht so gut, wie sie theoretisch sein koennten. lxLite kann beide Methoden verwenden, sowohl zum Packen, als auch zum Entpacken. Im Allgemeinen ergibt die zweite Methode die besseren Resultate, aber moeglicherweise (?) gibt es Dateien fuer die die erste besser ist. Aus diesem Grund werden defaultmaessig beide Methoden angewendet, die mit dem kleineren Ergebnis gewaehlt. lxLite kann auch benutzt werden, um Dateien zu entpacken, die bereits komprimiert sind, sei es mit mit lxLite, LINK386 oder REPACK von IBM. Was fuer Dateien koennen nun mit lxLite gepackt werden? Das LX Format wird unter OS/2 beinahe ueberall verwendet: Beinahe alles ist im LX format. Nicht nur EXE-Dateien, sondern auch .DLL, .PDR, .QPR, .DRV, .FON, .SYS-Dateien koennen mit lxLite gepackt werden. Sogar die VDDs (Virtual Device Drivers) in \OS2\MDOS koennen damit gepackt werden. Praktisch kann man lxLite auf jedes Datei loslassen: Wenn es kein LX ist, wird lxLite es nicht anruehren. Es ist also moeglich, den ganzen \OS2\*\ zu komprimieren, man bekommt jede Menge Extraplatz ohne irgendwelchen Overhead! Die Dekompressionszeit wird durch die verkuerzten Ladezeiten der verkleinerten Dateien von der Platte bei weitem aufgewogen. Also, Reboot von einer Diskette (eventuell von den beiden Installationsdisketten und dann F3 waehlen, dann das entsprechende Laufwerk waehlen, wo das installierte OS/2 liegt. Dann ist folgendes beim Command prompt einzugeben: \[path]\lxLite os2\*.exe os2\dll\*.* os2\dll\ibmnull\*.drv und so weiter. So koennen auch die Dateien, welche zur Laufzeit normalerweise gesperrt (EXE,DLL) sind, problemlos gepackt werden. lxLite Version 1.00 und hoeher ist sogar in der Lage Dateien, die gerade benutzt werden, zu packen. In diesem Fall kann warnt lxLite und fragt nach ob es das Modul auslassen oder durch seine gepackte Version ersetzen soll. Grundsaetzlich ist das ersetzen auch so kein Problem, nur muss man im Hinterkopf behalten, dass das Original bereits im Speicher sitzt, und so auch jede Menge Platz im SWAPPER.DAT auffressen. Ein Reboot sobald wie moeglich ist daher immer eine gute Idee. Versionen von lxLite ueber 1.00 gibt es in zwei verschiedenen EXE-Dateien: lxLite.exe ist die normale Version fuer OS/2 v2.99, Warp und hoeher. Die andere, namens lxLite2x.exe ist fuer die aelteren 32 bit Versionen von OS/2 (i.e. 2.x, NICHT 1.x weil unter 1.x gab es das LX Format noch nicht). Als OS/2 Warp User kann man es getrost loeschen. Version 1.1.0 und Hoeher erkennen Programme, die Daten nach der eigent- lichen LX-Struktur stehen (i.e. was auf DOS overlay data heisst). Watcom`s gebundene Programme (wie WCC.EXE Versionen >= 10.0) und Watcom Visual Rexx Programme haben so eine Struktur. In diesem Fall erzeugt lxLite eine Warnung und ersucht um Bestaetigung, ob ein solches Programm wirklich gepackt werden soll. Es ist SEHR empfehlenswert, dass zuerst eine Kopie von diesem Programm gemacht wird, bevor man es zu packen versucht, denn die Chance, dass es danach nicht mehr geht, ist sehr hoch. Das deshalb, weil lxLite (natuerlich) keine (prinzipiell moeglichen) Pointer innerhalb des Programms, die auf Daten, die an das Programm gebunden sind (wie zum Beispiel VX-REXX Programme), veraendert. 4. Optionen ----------- Es gibt jede Menge Optionen in lxLite. Ich liebe Optionen einfach :-) Deshalb kann man bei lxLite beinahe alles und jedes konfigurieren. Um den User vor allzuviel Konfiguration zu schuetzen, unterstuetzt lxLite eine einzelne Konfigurationsdatei, in der gleich einige Konfigurationen mitgeliefert ('factory defaults') sind. Sie sind weiter unten aufgelistet: --------------------------------------------------------------------------- DEFAULT (wird standardmaessig geladen): DEFAULT ist eine `Arbeitskonfigura- tion'. Alle Parameter sind auf maximale Kompression gesetzt. Die Er- zeugung von .BAK Dateien ist abgeschaltet. Beachte, dass diese Konfiguration IMMER geladen wird, bevor irgendwelche andere Optionen wirksam werden, sogar die /C{#} Option wird ausgefuehrt NACHDEM die DEFAULT- Konfiguration geladen Worten ist. FAST: Niedrigste Kompressionsrate, kuerzeste Ladezeiten. Wenn man IBM glaubt, werden Programmdateien schneller geladen, wenn Datenobjekte innerhalb der Datei an Sektorgrenzen (512 Bytes) ausgerichtet werden. Ich kann eigentlich keinen Unterschied feststellen, daher: Selber ausprobieren! Vorkomprimierte Daten werden nicht de-komprimiert und wieder re-komprimiert. FAST2: Packt ein bisschen besser, aber langsamer. Ladezeiten sind so schnell wie bei CFG#1. VER2X: Optimal fuer pre-Warp Versionen von OS/2. Versionen vor Warp (3.0) wissen nichts von der Lempel-Ziv (/EXEPACK:2) Methode. Programme sollten nicht mit Lempel-Ziv gepackt werden, falls die Moeglichkeit besteht, dass sie unter OS/2 2.xx (ausser 2.99) laufen sollen. FAILSAFE: Lempel-Ziv packen ist eingeschaltet. Ein fehlersichere Konfigura- tion. Alle Daten werden genau wie von LINK386 geschrieben, deshalb sind die Dateien etwas groesser als bei der DEFAULT-Konfiguration. Nur fuer WARP (oder hoeher) und 2.99! MAX: Beste Kompressionsrate. SEHR LANGSAM! Wird wohl selten gebraucht wer- den. NEWSTUB: Das ist eine spezielle Konfiguration mit der man den DOS-Stub in LX Programmen durch einen anderen ersetzen kann, ohne irgendetwas anderen zu veraendern. Du musst einen Dateinamen fuer den neuen Stub angeben - diese Konfiguration teilt lxLite mit, dass es alte, gepackte Objekte nicht entpackt und unkomprimierte Objekte nicht packt. MINSTUB: Diese Konfiguration ist mit NEWSTUB verbunden und ersetzt durch den kleinstmoeglichen Stub vom Typ `say-error-and-exit`. Kleiner gehts nimmer (glaub ich zumindest), ausser du kuerzt die Fehlermeldung. VDMSTUB: Diese Konfiguration befiehlt lxLite, den vorgefundenen Stub durch einen`run-from-VDM`-Type zu ersetzen. Dieser ist auch so kurz, wie moeglich:-). Bitte die Beschreibung der /T{#} Option fuer weitere Details durchlesen. INFO: Diese Konfiguration verwenden, um an Informationen ueber die Programmdatei zu erhalten ohne es neu zu schreiben (siehe auch Option /V+) --------------------------------------------------------------------------- Um eine spezifische Konfiguration zu verwenden, ist lxLite mit /C# als Parameter aufzurufen, wobei # der Name der Konfiguration ist. Die Einstel- lungen sind in der Datei lxLite.CFG im gleichen Verzeichnis, in dem sich lxLite.EXE befindet. Kuemmere dich nicht um Pfade, lxLite wird sein .CFG schon finden. Beispiel: Um die Konfiguration `max` zu verwenden, starte lxLite /cMax. Fuer eine detailierte Beschreibung des .CFG-Dateiformats, lies die ueber- naechste Sektion. Nun kommt eine detaillierte Erklaerung darueber was jeder einzelne Switch tut. Jeder Switch, der das '+'- oder '-'-Zeichen akzeptiert (um Aktion ein- oder auszuschalten) kann auch ohne Zeichen benutzt werden, das heisst dann halt '+'. Das heisst z.B., /V+ ist gleich wie /V. /A{P|S|N{P|S}} setzt die Ausrichtungsmethode (Alignment) fuer das erste und die weiteren Objekte. Das erste Objekt kann man auf [P]age shift, [S]ector oder [N]o boundary ausrichten. Die letzte Option (No boundary) wird von LINK386 niemals benutzt, aber es funktioniert, und das LX Format erlaubt es. Alle Objekte ausser dem ersten MUeSSEN zumindest auf PageShift boundary ausgerichtet sein. PageShift ist ein Wert, der im LX Header spezifiziert ist. Um ihn neu zu definieren, verwende die /R# Option. /B{+|-} Das Umbenennen der Originaldatei in .BAK ein- (+) oder ausschalten (-). Beachte bitte, dass das eine BETA-Version ist - deshalb sind .BAK Dateien standardmaessig eingeschaltet. /C{#} Verwenden der Konfiguration mit ID = #. Die zwei vordefinierten Konfigurationsnamen sind "DEFAULT" und "UNPACK". Die Erste wird immer geladen, wenn lxLite startet und die Zweite wird benutzt wenn die /X+ Option angegeben wird (NICHT gleichbedeutend mit /cUnpack). /D{#} Ausschliessen[D]e Dateimaske. Alle Dateien die zu einer der angegebenen Dateimasken passen, werden von lxLite uebergangen. Alle Dateimasken muessen durch Doppelpunkte (:) voneinander getrennt sein (weil ein : nicht Teil einer Maske sein kann). Zum Beispiel wird /D*.zip:*.arj:*.rar lxLite daran hindern .zip, .arj and .rar Dateien zu bearbeiten. Standardmaessig (/Cdefault) enthaelt eine Liste aller Progreammdateien, von denen bekannt ist, dass sie nicht richtig gepackt werden koennen. Mehrere /D-Switches hintereinander werden addiert, daher ist /D*.zip /D*.arj /D*.rar das gleiche wie das obige Beispiel. Um die Liste zu loeschen ist einfach /D zu verwenden. /F{+|-} Erzwungenes repacking. Ist zu verwenden um die Meldung `already processed` zu uebergehen, i.e. wenn lxLite denkt, dass die Datei schon bearbeitet wurde, das aber in Wirklichkeit nicht der Fall war. Das passiert normalerweise nicht, kann aber passieren, wenn man versucht einen Stub durch einen anderen Stub derselben Groesse zu ersetzen, und zwar bei einer bereits komprimierten Datei. /G[X|D|S]{#} e[X]tra / [D]ebug / [S]tub Daten werden in die spezifizierte Datei [G]eschrieben. Wenn lxLite eine LX Datei findet, die solche Daten enthaelt, und man diese Daten verwerfen (oder ersetzen bei einem Stub) will, wird lxLite sie in die spezifizierte Datei stellen, bevor sie verworfen werden. Die {#} Komponente kann auch eine Dateimaske sein, sodass man Daten in Dateien mit demseleben Namen, aber einem anderen Extender schreiben kann. Zum Beispiel /GD*.dbg teilt lxLite mit, dass es zu verwerfende Debug-Informationen in Dateien mit demselben Namen aber der Endung ".dbg" schreiben soll; der switch /GS*.stub.$s$ auf die Datei "myfile.exe" schreibt den Stub in die Datei "myfile.stub.$s$". Siehe auch die /O Option. /I{+|-} Zwingt (+) lxLite dazu, mit Idle Prioritaet zu laufen. Das heisst, es arbeitet nur, wenn keine andere Aktivitaet im System herrscht (d.h. es wartet auf Tasten und Mausbewegungen). Das ist meiner Meinung nach am besten, da lxLite so im Hintergrund laufen kann und die Performance beinahe ueberhaupt nicht beeinflusst. Nur wenn man eine ungezogene DOS-Box laufen hat, die sich alle CPU-Zeit schnappt, bleibt lxLite stehen. Wenn lxLite nun mit /I- gestartet wird aendert es seine Prioritaet nicht auf Idle, und daher mit einer bestimmten Prioritaet (z.B. via PRIORITY.EXE) gestartet werden. /L{#} Instruirt lxLite ein Logfile anzulegen. Es enthaelt nur die Dateien, die lxLite auch bearbeitet, uebergangene Dateien werden hier nicht aufgenom- men. wenn kein Name angegeben ist, wird lxLite.log im Verzeichnis in dem sich auch lxLite.exe befindet verwendet. Neben dem Dateinamen wird die Anfangs- und Endgroesse und die Probleme (falls welche auftraten). /M{R{N|1|2|3}|L{N|1}} Setzt die Kompressionsmethode und -parameter. Das zweite Zeichen definiert die Methode, die verwendet werden soll: `R` steht fuer Run-Length (/EXEPACK:1) und 'L' fuer Lempel-Ziv (/EXEPACK:2). Das dritte Zeichen ist der Kompressionslevel, der mit der Methode erreicht werden soll; Falls N spezifiziert wird, ist die Methode abgeschaltet. Drei Levels gibt es fuer die Run-Length-Kompression. Der Level 1 ist der schnellste. Er sucht nur nach 1-Zeichen Strings. Zum Beispiel, ein 'AAAAAAAA' String wird erkannt und zu 8, 1, 'A' gespeichert, waehrend ein 'ABABABAB' String unkomprimiert gespeichert wird. Level 2 erkennt Strings jeder Laenge bis 16 Zeichen. Das Beispiel von oben wird zu 4,2,'AB' kodiert. Das ist die Standardeinstellung fuer die meisten 'Factory`-Konfigurationen. Und als letztes, der dritte Level sucht nach allen Strings jeder Laenge bis zu einen halben Page-Laenge (= 2048). Diese Kompressionsmethode ist SEHR langsam und ergibt selten echte Ergebnisse, man sollte sie nur verwenden wenn man sie wirklich braucht. Der Lempel-Ziv Algorithmus kann nur entweder abgeschaltet (/MLN) oder eingeschaltet (/ML1) sein. Wenn er eingeschaltet ist, sucht er nach al- len Matches unter Verwendung einer ziemlich schnellen Hash-Tabelle, des- halb gibts keinen Grund die Kompression abzustufen. /O{X|D|S}{+|-}. [O]utput e[X]tra/[D]ebug/[S]tub Daten immer (+) oder nur wenn verworfen (-). Wenn es abgeschaltet ist (/O-, Standard) arbeitet der /G Switch wie vorher, i.e. Daten werden nur geschrieben, wenn sie in der Quellda- tei verworfen werden sollen. Wenn die /O+ Option benutzt wird, werden die Daten immer geschrieben (wenn die entsprechende Dateimaske in /G Option angegeben wurde). Falls {X|D|S} nicht angegeben wird, gilt die Option fuer allen Arten von Daten (Extra,Debug,Stub) (i.e. /O+ schaltet das Feature fuer alle X/D/S Daten ein, /O- schaltet es fuer alle ab). /P{+|-} Ein- (+) oder ausschalten (-) einer Pause vor jeder Datei. Das Programm zeigt den Namen der Datei, die als naechstes gepackt werden soll, und ermoeglich eine Auswahl, ob sie bearbeitet oder in Ruhe gelassen werden soll. /Q Alle Konfigrationsoptionen abfragen. Im Prinzip ist das ein buntes Listing der lxLite.cfg Datei :-) Andere Optionen falls vorhanden, werden ignoriert. /R{#} [R]e-align (ausrichten) der Pages auf eine spezielle Boundary. (#) muss eine Potenz von 2 sein. Diese Option ist analog zu LINK386`s /ALIGN: Switch. Viele Programmierer kuemmern sich nicht darum, dass das /A: standardmaessig auf eine Boundary von 512 (ein Sektor) gesetzt ist und richten jede Page der ausfuehrbaren Module auf 512 Byte aus. Das Ergebnis ist ein Haufen unbenutzter Platz innerhalb der Programmdatei. Man kann nun solche Dateien mit einer anderen /ALIGN: Option neu linken. Standardmaessig ist /R:4. Um lxLite zu zwingen sich wie LINK386, muss man /R:512 verwenden. Das ist equivalent zu /ASS :-) . /S{+|-} Zeigen (+) oder nicht zeigen (-) der aktuellen Konfiguration. Das ist ganz brauchbar, um mal zu schauen welche Einstellungen in der CFG-Datei gespeichert sind, besonders bei verketteten Konfigurationen (siehe weiter unten). Beispiel: lxLite /CDEFAULT /S zeigt die standardmaessigen Einstellungen. /T{#} Die mit # spezifizierte Datei als neuen DOS-Stub verwenden. Ein DOS-Stub ist eine kleine DOS-.EXE-Datei, die in eine OS/2`s LX-Datei gelinked wird, damit das Programm eine Fehlermeldung ausgibt, wenn es von DOS aus gestartet wird. Normalerweise sieht das etwa folgend aus: Dieses Programm laeuft nur unter OS/2 Mit lxLite kommen 2 DOS-Stub-Programme mit: stub_min.bin und stub_vdm.bin. Der erste ist ein Standard-`Schreib geht nicht und Ende` Typ, aber er ist etwas kleiner als die ueblichen DOS-Stub-Programme die von den ueblichen Linkern erzeugt werden. Der zweite ist ein Stub, der eine neue OS/2-Session startet und das Programm daraus startet. Falls OS/2 nicht gefunden wird, die uebliche Fehlermeldung produziert. Standardmaessig laesst stub_vdm.bin OS/2 den Sitzungstyp bestimmen. Alternativ dazuy, kann man den Sitzungstyp auch in stub_vdm.bin festlegen. Dafuer braucht man einen Hexeditor - man muss nach dem String `SesType->' im Stub suchen und das Byte, das unmittelbar nach dem Pfeil kommt (->) durch den gewuenschten Sitzungstype ersetzen, wobei folgende Tabelle gilt: 00 - OS/2 session manager determines type (default) 01 - OS/2 full-screen session 02 - OS/2 windowed session 03 - PM application 04 - VDM full-screen session 07 - VDM windowed session /U{+|-} Ein- (+) oder ausschalten (-) des Entpackens einer Datei vor dem Packen. lxLite weiss wie man beide der beschriebenen Methoden zum Entpacken verwendet, deshalb ist die Option standardmaessig ist eingeschaltet. Ausschalten ist nur dann sinnvoll, wenn Zeit gespart werden soll. /V{+|-} Verbose (zeigt ein ganzen Haufen Dateiinformationen) Das ist der Schalter fuer Neugierige:-) Mit /V+ zeigt lxLite ein paar Informationen ueber die bearbeitete Datei an (um komplette Information ueber .LX Dateien zu bekommen, rate ich jedem exeHdr.EXE aus dem OS/2 Programmer`s Toolkit zu verwenden). /W{+|-} Ein- (+) oder ausschalten (-) ob das Ergebnis des Packens auf die Platte geschrieben werden soll. Standardmaessig ist es eingeschaltet (nona!), aber du kannst es ausschalten falls du die Informationen ueber /V+ anschauen willst, ohne die Datei neu zu packen und frisch zu schreiben. Diese Option kann auch fuer debugging der Optionen nuetzlich sein. /X{+|-} e[X]pandieren (+) oder Packen (-) der uebergebenen Dateien. Diesen Switch verwendet man, um Dateien zu entpacken. lxLite kann sowohl Dateien, die es selbst komprimiert hat, als auch solche, die von anderen Programmen mit den Standardmethoden gepackt wurden. (i.e. Resource Compiler, LINK386, REPACK). /X- ist nicht identisch mit der /cUnpack Option. /Z{#} Diese Option setzt den `threshold` fuer lxLite und hilft so festzustellen, ob eine Stub ein `dummy` ist oder ob er eine spezielle Funktion hat. Es gibt einige Programme (zum Beispiel, \os2\xdfloppy.exe) die sowohl unter DOS als auch unter OS/2 laufen - in solchen Programmen ist die DOS Executable in der OS/2` LX als ein DOS stub implementiert. Standardmaessig (wenn man einfach /Z benutzt) lxLite haelt jeden Stubs der groesser als 1024 Bytes ist, fuer einen funktionellen, und daher hat die /T{#} Option auf diese keinen Effekt. /?,/H Zeigt eine kurze Hilfe an. Diese ist ganz brauchbar, wenn man einen Switch aus der ganzen Liste vergessen hat:-) --------------------------------------------------------------------------- Das .CFG Dateiformat ist so simpel wie moeglich: Es ist eine reine ASCII Textdatei, welche mit jedem beliebigen Texteditor bearbeitet werden kann. Jedes Zeichen nach einem Strichpunkt ';' wird ignoriert, i.e. damit koennen Kommentare in die Konfigurationsdatei eingesetzt werden: ; Diese Zeile ist ein Kommentar Jede Zeile, die mit einem Wort und einem Doppelpunkt beginnt (z.B.: "Wort:") wird als einzelne Konfiguration behandelt. Das Wort identifiziert die Konfiguration. Das ist ein Beispiel fuer einen Konfigurationseintrag: FAILSAFE: /APP /B- /G+ /R4 /MR2 /ML1 /P- /U+ /V- Wie man sieht stehen nach dem Doppelpunkt beliebige Switches, wie man sie auch in der Kommandozeile nach lxLite schreiben wuerde. Rekursive /C Optionen werden nicht ignoriert, so dass man mehrere Konfigurationen aneinander binden kann, aber die /C Option wird als letztes verarbeitet, das heisst von zwei ueberlappenden Optionen wird nur die letzte effektiv sein. Als Beispiel: here: /app /b- /g+ da : /ass /b+ /p+ /chere "lxLite /cda " ist also gleichbedeutend mit "lxLite /app /b- /p+ /g+". Man beachte, dass lxLite auch weitere Aufrufe auf dieselbe Konfiguration ignoriert, um unendliche Schleifen zu vermeiden. Das bedeutet, "lxLite /cOne /" wird die `One` Konfiguration nur EINMAL laden. 5. Fehlermeldungen ------------------ Wie die allermeisten normalen Programme erzeugt lxLite manchmal Fehlermeldungen :-) Manche von Ihnen erscheinen in aehnlichen Situationen haben aber unterschiedliche Ausloeser. Hier ist eine kurze Liste der haeufigsten Fehler: * Invalid Konfiguration Datei format: Ungueltiges Format der Konfigurationsdatei. Selbsterklaerend:-) * Error reading Konfiguration Datei: Diese Meldung wird nur generiert, wenn die Konfigurationsdatei phy- sisch nicht lesbar ist. Das Programm erzeugt keine Fehlermeldung falls die Konfigurationsdatei einfach fehlt. * Error writing Konfiguration Datei: Fehler beim Schreiben der Konfigurationsdatei. Selbsterklaerend:-) * Error reading executable Diese Meldung wird generiert, wenn die Programmdatei physisch nicht lesbar ist. * error writing executable Diese Meldung wird generiert, wenn die Programmdatei nicht mehr auf die Platte geschrieben werden kann. Das kann dann passieren, wenn auf der Platte zuwenig Platz ist, lxLite selbst ueberprueft das nicht. * invalid executable file format Die Datei ist nicht vom Format [L]inear E[x]ecutable. Bei EXE-Dateien kann diese Meldung auftreten, wenn sie im alten, '[N]ew [E]xe (bwhahaha)' Format sind oder eine DOS-EXE-Datei oder eine WinDOS- EXE- Datei. * unsupported executable format revision Diese Meldung wird generiert (vielleicht:-), wenn die Programmdatei eine andere Dateiformatrevision hat als 0. Da OS/2 Warp normalerweise nur mit Revision 0 arbeitet, duerfte dieser Fehler normalerweise nie auftreten. * invalid word/dword ordering in executable Die Datei verwendet die 'little-endian' Byte order. Wahrscheinlich ist sie nicht fuer eine Intel-Plattform-Maschine gedacht. * executable target ist an unsupported CPU type Das kann passieren, falls die Ziel CPU eine andere als 286, 386, 486 oder P5 ist. * executable target ist an unsupported OS Das heisst, dass die Programmdatei nicht fuer OS/2 ist. WinDOS 95 verwendet ein aehnliches Format, aber seine Kennung ist nicht LX sondern LE, daher sollte es normalerweise eine 'invalid format' Meldung geben. * unknown entry bundle type in executable * unknown page flags in executable * invalid object page detected in executable Diese alle bedeuten, dass lxLite etwas ueber die interne Struktur nicht versteht. Ich bitte um Benachrichtigung, falls jemand Dateien findet bei denen diese Fehlermeldungen auftreten. * nicht enough memory to load executable Ich glaube nicht, dass dieser Fehler unter OS/2 auftreten kann:-) Eher wird eine 'Kein Platz mehr im SWAPPER.DAT' Meldung auftauchen. Wie auch immer, ich finde, es war keine gute Idee der IBM-Programmierer einen Fehler zu erzeugen, statt auf die Speicheranfrage einfach einen NIL-Pointer zurueckzugeben:-( 6. To-do-Liste -------------- Das ist eine Liste aller Features, die plane in zukuenftigen Versionen einzubauen. Jede Anregung ist willkommen, wie man mich erreicht, siehe letztes Kapitel. * Vielleicht eine Moeglichkeit, den LX Stub in VX-REXX Programmen zu packen; Ich weiss nur nicht obs wirklich gebraucht wird, der Unterschied in der Groesse macht gerade mal 18K aus - lxLite kann das echte Programm nicht packen, da es 1.) ausserhalb der LX-Struktur ist 2.) irgendwie verschluesselt ist und solche Daten ueberhaupt nicht gepackt werden koennen, PKZIP nicht einmal PKZIP kann das. * Vielleicht eine 'extra-pack'-Option, ich haette da eine Idee, wie man Programmedateien wirklich klein kriegt (kleiner als DOS-Packer jeden- falls:-); diese Programme wuerden dann aber nicht so wie ueblich arbeiten - sie waeren immer 'unlocked' (siehe auch das UNLOCK-Utility) i.e. sie werden im Swapfile landen, wenn nicht genaug Speicher da ist, sie werden nicht langsamer, aber das Swapfile wuerde dramtisch wachsen, wenn so ein Programm gestartet wuerde. Daher, sagt mir ob ihr sowas haben wollt, wenns genug Nachfrage gibt, mache ich es. 7. Bekannte Fehler und Einschraenkungen -------------------------------------- Hier ist eine Liste von Programmen, die sich aus irgendeinem Grund nicht packen lassen, probieren sinnlos: * PMJPEG v1.5 bis 1.74. Wie auch immer, sogar IBM`s REPACK kann es nicht packen, ich denke, dass es sich entweder um einen Bug im Linker, der benutzt wurde, um es zu generieren (die ganze EXE hat eine seltsame Struktur) oder eine Art debug-Schutz (Pruefsummen?). * VX-REXX-Programme. Der Hauptteil des Programms (der verschluesslte REXX-Code) wird einfach an einen kleinen LX-Stub angehaengt. Diese Programme haben eine unbekannte Struktur und wenn lxLite den Stub komprimiert, funktionieren sie ueberhaupt nicht mehr. * Watcom C & C++ v>=10.0. Schaut so aus als wuerde Watcom gerne Muell an die Dateien anhaengen. Diese Dateien sind dafuer gedacht, sowohl unter DOS als auch unter OS/2 zu laufen und haben ebenfalls eine seltsame Struktur. * ZIPBRAND v1.11. Es ueberprueft, ob sein .EXE-File veraendert wurde, vermutet einen Virus und will dann nicht mehr laufen [Ergaenzung des Ueber- setzers]. * InterCom. 8. Den Autor kontaktieren ------------------------- Via Email bin unter folgenden Adressen erreichbar: FIDOnet: 2:5030/84.5 (ist mir am Liebsten) Internet: bit@freya.etu.ru Enjoy, _\ndy 9. Der Uebersetzer ----------------- Ich war von Andys Programm so begeistert, dass ich ihm spontan angeboten habe, fuer ihn die Dokumentation der Version 1.01 ins Deutsche zu ueber- setzen. Manches klingt etwas holprig, aber erstens mache ich das nur hobbymaessig, zweitens bin ich kein professioneller Programmierer. Aber ich hoffe, es hilft trotzdem etwas. Die Uebersetzung zu 1.1.5 ist bereits ein kleines bisschen weniger holprig und enthaelt etwa 60 Tippfehler weniger als die zu 1.0.1. Via Email bin unter folgenden Adressen erreichbar (obwohl das ziemlich sinnlos ist, da ich ausser der Uebersetzung nichts beigesteuert habe): FIDOnet: Herwig Bauernfeind, 2:312/5.35 (ist auch mir am Liebsten) InterNet: H_BFD@fidonet.at (funktioniert zur Zeit aber nicht so gut) ═══ 1.6. Error messages ═══ Error messages Like most normal programs :-) lxLite can eventually generate error messages. Some of them can appear in similar conditions, but caused by different causes. Here is a short list of the most frequent errors: Invalid configuration file format Self-explaining, I think :-) Error reading configuration file Self explaining. error reading executable This is generated if executable is physically unreadable. error writing executable This is generated if executable cannot be written onto disk. The cause can be the insufficience of disk space - lxLite does not check for this particular error. invalid executable file format The file is not in [L]inear [E]xecutable. Note that you can get this message for files with .EXE extension in the cause they are in old, 'New Exe' (bwhahaha) format or DOS executable or winDOS executable. unsupported executable format revision This error can happen (may be :-) if you try to process an executable with other revision number than 0. OS/2 Warp works only with revision 0, so you will not normally encounter this problem. invalid word/dword ordering in executable The executable uses little-endian byte order. Seems that it is not for Intel platform machines. executable target is an unsupported CPU type This happen if the target CPU is other than 286, 386, 486 or P5. executable target is an unsupported OS This mean that the executable is not for OS/2. Windos and windos 95 uses similar format, but its magic number is not `LX` but `LE`, so usualy program will abort with an `invalid format` error. unknown entry bundle type in executable unknown page flags in executable invalid object page detected in executable It`s something about internal structure that lxLite doesnt know about. Please mail me if you encounter such files. not enough memory to load executable I doubt this error can happen in OS/2 :-) Rather a swap-file full fault will occur. BTW, it`s a bad idea of IBM programmers to trap instead of returning NIL pointer on a memory request :-( invalid stub Stub size must be greater or equal to 64 bytes. This requirement is due to limitation that offset to LX header must reside on the offset 60 in the stub; however it is unlikely that you`ll got this message since lxLite will add trailing zeros to such stubs. error reading EAs Cannot explain :-) error writing EAs this one too :-) invalid fixup record lxLite above 1.1.8 will depack and try to re-pack fixup records. Previous versions just read/write fixup table as a bunch of bytes; new versions will try to see what they contain. This error can happen when converting NE files since some of them ( TFTP.EXE for example) contains so-called OSFIXUP records that is outdated and don`t have analogue in LX executable format. However, these executables are seldom encountered (I`ve seen only mentioned TFTP). I don`t know an workaround for this: you cannot convert such NE files. bound application Executable is an bound application. Bound application is an NE executable which runs both in DOS and OS/2 mode. These are NOT two different executables bundled together (as most dual-mode programs are done: you can do this with lxLite inserting an different DOS stub into LX executable) but rather an tiny 'OS/2 emulator for DOS mode' binded together with NE file. These are usually programs with the simplest possible user interface - such as most executables from MASM 6.0 package. These executables can still be converted by overriding this with the /NB+ option, but they won`t run in DOS mode anymore. doesn`t support long filenames Executable is not long file name - aware. NE files uses a bit in NE header which shows whenever executables handle long file names. If it isn`t, OS/2 doesn`t show him LFN (just as for DOS programs). In some (most that I seen) cases this is of no importance since such executables doesn`t work with files (for example ARP.EXE or INETD.EXE from TCP/IP). You can override this error message by using the /NL+ option. incompatible segment definition NE executable contains an segment which don`t have direct analogue in LX executable format. This is done mostly since I haven`t seen executables with such segments (namely GDT and HUGE). If you encounter any, let me know, please. bad executable segment Executables contain an bad segment definition (either it is bigger than its declared size, or it is partially (or fully) out of executable file). If it works, I will be surprised :-) ──────────────────────────────────────────────────────────────────────────────── Title page | Introduction | Features | Command-line switches | Configuration file | Bugs and limitations | Thanks... | Utility Pack | Author info ═══ 1.7. Features ═══ Features lxLite compresses the files in the same way as LINK386 does. There is NO way of implementing an effective (by memory requirements) compression method other than those two which Warp kernel knows and will recognize (or the only for 2.x) since unlike DOS OS/2 does paging and pages are loaded by kernel paging mechanism which runs at ring 0. There is no documented way to intrude inside the OS/2 kernel even from device drivers (which also runs in ring 0). So, here is a brief description of these two algorithms: 1. Run-length packing. This is generally the same method that Microsoft C for DOS uses. It gives VERY bad results because the structure of executable files aren`t suited for that kind of packing. For example, PCX files uses approximatively the same packing method. 2. Kinda Lempel-Ziv algorithm. Lempel-Ziv is the same method which almost all DOS executables packers use - LZEXE, PKLITE, PGMPAK etc. The method standartized for OS/2 executable files is not the most effective (IMHO). Other thing is that OS/2 executable have a different loading algorithm in contrast to DOS executables - parts of OS/2 executables are loaded only when they are needed. So, Lempel-Ziv dictionary cannot cross the bound of a single page (4096 bytes). Because of this, it gives not such good results as it can. lxLite can use any of these two methods either for packing or unpacking. Generally the second gives best compression rates, but may be (?) there are some files on which first will work better. Because of this the default is to try to pack page using both methods and then choose the smaller result. lxLite can be used as well for unpacking the files that previously have been packed - either by lxLite, LINK386 or REPACK from IBM. In some (seldom) cases you should specify the /F (force) option to force repacking - otherwise lxLite can give the "module is already packed" message. What kind of files you can compress? The LX format is used almost everywhere in OS/2: almost everything is in LX format. So, you don`t have to limit only to .EXE files: you can pack .DLL, .PDR, .QPR, .DRV, .FON, .SYS (Virtual Device Drivers (VDDs) in \OS2\MDOS) as well. You can run lxLite on virtually any file: if it is not in Linear Executable (LX) format it will fail to process it. Versions above 1.1.7 of lxLite can also convert to LX and compress most NE executables: this is a tricky thing but seems that in most cases it works well. If it cannot be acomplished, lxLite will give you an error message. If you don`t like this, you can disable this by using the /N- option on the command line. By default lxLite will convert *only* .EXE and .DLL files, which doesn`t contain resources, are long-filenames aware (.EXEs) and are not 'bound executable's (.EXEs). Some conversion considerations: NE files have a bit in the header that shows if the module handles long file names (since OS/2 v1.0 didn`t have long file names: HPFS was introduced in version 1.2). Executables with this bit set will see files with LFNs, when this bit is not set whey will work just like DOS programs do, i.e. won`t see files with LFN. Many NE executables doesn`t have this bit set, although they don`t care at all about filenames (for example, ARP.EXE, IFCONFIG.EXE from TCP/IP). Moreover, many executables that even works with file names will work as well with the long file names (for example I tried some UUENCODE/UUDECODE clones). By default lxLite will fail to convert such files into LX since LX modules doesn`t have such a bit in header, but you can force conversion by using the /NL switch. Default configuration file instructs lxLite to ignore this bit for all known to me kinds of dynamic-link libraries: DLL, DRV, FON, PDR, QPR (although last four extensions, as far as I know, always are LX modules). Also there is a number of NE executables (for example most EXEs from SIO or MASM 6.0 package) which are so-called 'bounded' (also known as "Family API") executables. A bounded executable can run both under DOS and OS/2, but not the way as LX modules do (one file contains TWO different executables; DOS executable is binded as stub to OS/2 LX executable), but other way: DOS stub is a small program which loads and executes NE executable under plain DOS, and emulates a (very) limited set of OS/2 API calls via BIOS and DOS interrupts. By default lxLite will also fail to convert such executables into LX modules since resulting executables won`t run under DOS anymore: however, if you have PROTECTONLY=YES in CONFIG.SYS or simply don`t need the executable to run under DOS, you can change the behavior of lxLite using the /NB switch on the command line. Another incompatibility between LX and NE files are resources. If NE module contains resources and they`re loaded using the Dos16GetResource API function, API will return an error code when trying to load same resources from an LX file. So, by default, lxLite will fail to convert NE modules that contains resources (however, there are not too much such modules). However, you can override this by using the /NR switch. As a example of a DLL with resources you can look at \TCPIP\DLL\TCPMRI.DLL. Many NE utilites (such as ARP, PING etc) uses Dos16GetResource to load resources from TCPMRI.DLL, and will display an 'Failure in national language support' instead of almost all messages. There is an alternative API function for 16-bit modules: DosGetResource2, which will work well for an LX file. So if you`re sure that all resources in a file are loaded exclusively through DosLoadModule2, you can force lxLite to convert such NE files by using the /NR switch. lxLite version 1.00 and above can replace executable modules even if they are currently in use. In this case it will warn you that module is already in use by another process, and will propose you either to replace it by its packed version or either to skip this module. Choose at your wish, but keep in mind that the modules you have replaced are kept now (their old versions) in memory, so they eat up your swapfile space. Better reboot as soon as you have this opportunity. You can also consider compressing your entire \OS2\*\ directory structure, it will give you a lot of extra space and absolutely no overhead! The time spent for decompressing executables is recovered by the time which system does not spend for reading the executable from HD because it`s much smaller! You can even compress the DLLs which are currently locked (lxLite will unlock them, but swap file will increase, so you will need to reboot after this). For this, you have to type: lxLite #:\os2\* /r /yur where # is drive letter of your boot drive. Version 1.1.0 and above detects executables which contains some data after the LX structure itself (i.e. what`s called in DOS overlay data). For example Watcom`s binded executables (such as WCC.EXE versions >= 10.0) and Watcom Visual Rexx executables have such structure. In this case lxLite shows an warning message and asks for confirmation whenever you really want to pack such executable. It is STRONGLY recommended that you backup the executable in question before trying to do it because it is VERY possible that it will become non-functional if something gets changed in it (because lxLite does not change any of possible pointers in data binded to LX as in VREXX executables). Default configuration file instructs lxLite to back up automatically such executables (by using the /BX switch). All backed up filenames are stored by default into the \lxLite.bak directory. ──────────────────────────────────────────────────────────────────────────────── Title page | Introduction | Command-line switches | Configuration file | Error messages | Bugs and limitations | Thanks... | Utility Pack | Author info ═══ 1.8. Introduction ═══ Introduction I think all of us end-users are really bored of the big size and reduced functionality of all those modern executables written to run under OS/2 (windos too). I don`t understand why they are so big, because most compilers, even IBM CSet/VACPP generate a modest size code. For a widely known example let`s take MultiMaint. What a complex task it performs that its executable occupies more that 700K? I don`t understand. Moreover, WHY duplicate (and triplicate) almost the same executable as it does (I mean MultiSafe and IniMaint which comes along with MultiMaint). It performs a nice work, but it is TOO big for the task it acomplishes. OS/2 kernel have the same size, and performs INCOMPARABLY much more things. I cannot afford such a large pile of shit on my HD, so I killed MultiMaint & C°. :`-(. Too bad for its author. ; Here is a workaround for this. You can just pack the executable so it will be twice smaller and still perform the same task. Alas, it will grab the same amount of memory as original executable does - this is the fault of the program`s author. But it will load (and swap) faster in most cases (unless you have a Fast UltraWide SCSI 2 HD :-) As far as I know there is only one program which does the same - REPACK from IBM (EWS?). But compared to lxLite it gives less compression using same algorithm. For example, COURIER.FON from OS/2 v8.192 it compresses into 44K and lxLite into 34K. Feel the difference. BTW, LINK386+Resource Compiler compiles COURIER.FON also into 44K-size file. This makes me think that they use the same common compression code. I`ve packed ALL my executables (incuding but not limiting to ?:\os2\*.exe, ?:\os2\dll\*.* and ?:\os2\dll\ibmnull;laserjet) and my system is stiil working fine :-) One of lxLite users (Pavel Roskin) observed that lxLite packs even os2krnl :-) This is a very nice feature to create a SINGLE OS/2 boot diskette, moreover, since version 1.1.8 lxLite has the ability to pack even device drivers, so you can even gain a little of free space on that diskette, enough to put there say FC/2 or other text-mode shell. ──────────────────────────────────────────────────────────────────────────────── Title page | Features | Command-line switches | Configuration file | Error messages | Bugs and limitations | Thanks... | Utility Pack | Author info ═══ 1.9. lxLite_ru.txt ═══ ──────────────────────────────────────────────── LX lite - паковщик для выполняемых файлов OS/2 ──────────────────────────────────────────────── * Этот текст - всего лишь сокращенная версия английской документации. Для получения полной информации по данной программе обращайтесь к ней. Здесь же приведены только основные моменты отраженные в английской версии. Надеюсь что мой убогий английский не помешает Вам понять что же там на самом деле написано. 1. Вступление ───────────── Меня откровенно достали :-) огромные размеры современных программ, при их ограниченной функциональности. Поэтому я уже почти год мечтаю о программе для OS/2 которая бы делала для OS/2 то же что для DOS - lzexe, pklite, diet, compack, ainexe и много-много других. Однако она все задерживалась. Правда примерно в декабре по MFE.OS2 проходила программа REPACK которая вроде бы частично решала проблему, перепаковывая exe`шники примерно так же как это делает LINK386 с опцией /EXEPACK:2. Однако убогий интерфейс :-) и полное отсутствия опций в ней меня окончательно достало, и я решился взяться за дело собственоручно (вариант: собственноножно ;-). Попутно оказалось что REPACK выжимает далеко не все возможное из опции /EXEPACK:2. lxLite пакует в среднем процентов на 10 лучше чем REPACK, что в сумме дает весьма неплохой выигрыш. Например стандартный COURIER.FON у меня занимал 44K (пакованный REPACK`ом) - после lxLite он стал занимать 34K. Почувствуйте разницу :-) Ну и другие плюсы lxLite - повышенная конфигурабельность, наличие некоторой дополнительной информации во время операции паковки, возможность вывода некоторой информации о обрабатываемом exe`шнике (для любопытных :-) - я думаю вы оцените в процессе эксплуатации. Если кто-то считает что уменьшение EXE`шников в размере в среднем раза в два - это крохоборство, то эта программа явно не для Вас. lxLite проверен в работе на практически ВСЕХ моих выполняемых файлах для OS/2 (в том числе на c:\os2\*.exe; c:\os2\dll\*\*.*; забавнее всего что пакуется даже OS2KRNL /thx to Pavel Roskin/) и как ни странно все работает. Подробнее об опциях lxLite и выполняемых ими функциях можно прочесть в английской документации. Если же Вы не знаете английского, не огорчайтесь - скорее всего эти опции Вам не нужны. Для обычного запуска lxLite просто наберите lxLite *.exe *.dll в каталоге в котором у Вас находятся выполняемые файлы OS/2. Если же Вам хочется распаковать файл(ы) наберите то же самое но добавьте /x. Счастливого пользования. Андрей Заболотный, FIDOnet: 2:5030/84.5 e-mail: bit@freya.etu.ru ═══ 1.10. Command-line switches ═══ Command-line switches There are a lot of options in lxLite. I simply like options :-) So, you can configure almost anything in lxLite. Moreover, to protect the user from need of writing the same options lxLite support multiple configurations which are kept in a single file. lxLite comes with some example configurations (`factory defaults`) which are listed below: ──────────────────────────────────────────────────────────────────────────────── default (loaded by default) It is a `work` configuration. All parameters are set to optimal level of compression without too much effort applied. File backup is disabled except for files that have extra data after LX structure. Note that this configuration is ALWAYS loaded before any other options are in effect, so even /C{#} option is executed AFTER default configuration is loaded. unpack (loaded for /X option) This configuration is loaded when you request to unpack the file (/X). By default it is empty; you can add here everything you want to happen when files are unpacked. ver2x Optimal for pre-Warp versions of OS/2. Versions before Warp (3.0) does not know of the Lempel-Ziv (/EXEPACK:2) method. DON`T PACK EXECUTABLES WITH LEMPEL-ZIV`s ALGORITHM if there is a chance to run your program on OS/2 v2.xx (except 2.99). max Tightest compression level. VERY SLOW! It is rarely needed to use this configuration. newStub This is a particular configuration used to replace one DOS stub in LX executable by another without altering anything else. You have to specify a filename for new stub - this configuration only tells lxLite not to depack old objects and not to pack unpacked objects. minStub This is a configuration which is linked to newStub and replaces stubs in given files by minimal possible stub of `say-error-and-exit` type. You cannot make it smaller (at least I doubt it), only if you shorten the error message. vdmStub This configuration tells lxLite to replace in specified files stub by a `run-from-VDM`-style one. This is also as short as possible :-) Please read the /T{#} option description for further details. info Use this configuration to get the most important information about executables (see option /V) without altering them. exehdr Shows complete information about the executable header. Module file is not altered in any way. exemap Shows anything about the executable structure. This can generate sometimes very long data sheets, so use it only if really needed. map Shows the memory map of the executable: memory objects and pages which makes the object. exp Shows everything that is exported from the module (exported names and exported entriy points) imp Shows module import tables pdd This configuration can be used for physical device drivers (especially in NE format). dll This configuration is useful for dynamic-link libraries. ──────────────────────────────────────────────────────────────────────────────── To use a specific configuration use the /C:# switch where # is configuration`s identifier. Settings are loaded from file lxLite.CFG in the same directory where lxLite.EXE resides. You shouldn`t care about paths - lxLite will always find it. For example, to use `max` configuration run lxLite /c:Max. For a detailed description of .CFG file format see section right below the following. Here is a detailed explanation of what each switch does. Note that any switch which accepts '+' or '-' sign after it (to enable/disable the action which switch symbolizes) can be used without anything after it - this is accepted as '+'. For example, /V+ is equivalent to /V. ──────────────────────────────────────────────────────────────────────────────── /A[{P|S|N{P|S}}{:#}] Set alignment method for first and rest of objects. First object can be aligned on [P]age shift, [S]ector or [N]o boundary. Note that the last option (No boundary) cannot be achieved by using LINK386, but it works well, and the LX format allows it. All objects except first MUST be aligned on at least PageShift boundary. PageShift is a value that is specified in LX header. You can redefine it too by specifying a semicolon and a decimal value after it: for example the /APP:512 switch will place all pages in executable on 512 bytes boundary. Note that the # value must be a power of two (i.e. 1,2,4,8,16,32,...). /B(D|X|+|-){:%} Enable (+) or disable (-) copying original file into *.BAK; optionaly lxLite can do it only when [D]ebug and/or e[X]tra data are detected. Also you can specify an directory % for backed up files (relative to root). The entire directory tree will be re-created inside the backup directory. For example, the /BX:c:\lxlite.bak switch will instruct lxLite to back up files only when e[X]tra data is present in module and to place them into the directory structure under the c:\lxlite.bak directory. /C{S}{+|-} Enable (+) or disable (-) colored output. You can specify {S} to force lxLite to use StdOut instead of VioXXX functions. /C[:%] Use configuration with ID = %; The two predefined configuration names are "default" and "unpack". First is always loaded as lxLite starts and second is used when /X+ option is specified (this is NOT equivalent to /c:Unpack). / E{#} Set [E]xclude filemask. All files that fits given filemask(s) will be bypassed by lxLite. All filemasks must be separated by ':' (because it cannot be a part of filemask). For example /D*.zip:*.arj:*.rar switch will instruct lxLite to avoid all .zip, .arj and .rar files. Default lxlite configuration (/C:default) includes the /C:exclude configuration which instructs lxLite to avoid all executables which are known to have problems when packed. Note that the /D switches are additive, so /D*.zip /D*.arj /D*.rar is equivalent to the example above. To clear exclusion list use specify /D. /F{+|-} Force repacking. Use /F+ to bypass `already processed` message, i.e. when lxLite thinks that file was already processed and it really wasn`t. This usually doesn`t happen, but can happen when you try to replace a stub by another of the same size in a already packed file. /I{+|-} Force (+) lxLite to run at idle priority. This mean that lxLite will do its work only when no other activity in system occurs (waiting for an keyboard/mouse event etc). This is the best in my opinion choice because you can run lxLite in background and it will not degrade almost at all system performance. However if you`ll run an `badly-behaved` VDM session which grabs all CPU time lxLite will completely stop. When run with /I- option lxLite does not changes its priority (i.e. you can run lxLite /I- via priority.exe program which starts programs with given priority). /J[A|E|L|P|V](E|L|P|V|N|X|+|-) Change module type: Leave [A]s-is, [E]xecutable module, [L]ibrary module, [P]hysical or [V]irtual driver. Especially useful when converting NE drivers. Optionaly you can restrict this to work only on [E]xecutables, [L]ibraries, [P]hysical or [V]irtual drivers, [N]E or L[X] executables and any combination of them. [N]E and [L]X conditions are considered with an AND operator; all others with OR, i.e. /JPELN will mean: "Change module type into [P]hysical device driver for all [E]xecutables OR [L]ibraries which also are (AND) [N]E modules" /L(A|S|U|+|-){:%} Instructs lxLite to maintain an log file. If no file name is specified, lxLite.log is used in the home directory of lxLite. Beside the filename, the start and final file size is written into log along with the problems (if any) that were encountered when processing (for example: 'Executable has been used by another process and replaced'). You can also optionaly choose to log either [S]uccessful or [U]nsuccessful cases or [A]ll (which means more than just /SU+: lxLite will also log 'already processed' files). /M[R[N|1|2|3]|L[N|1]|F[N|1|2]] Set packing method & parameters. Second character (after M) defines the method to set-up: `R` stands for run-length (/EXEPACK:1), 'L' for Lempel-Ziv (/EXEPACK:2) and 'F' for Fixup packing method. The third character is the level of compression using that method; if N is specified the method is disabled. Three levels of packing are provided for run-length compression. The level 1 is the fastest. It searches only for 1-character strings. For example, the 'AAAAAAAA' string will be detected and packed as 8, 1, 'A' while 'ABABABAB' string will be stored as unpacked text. Level 2 detects repeated strings of up to 16 characters length, so the example above will be encoded as 4,2,'AB'. This is the default setting for most 'factory` configurations. And last, 3rd level searchs for ALL strings of any length (up to page size/2 = 2048). This compreses VERY slow and seldom gives real results, so use it only when you really need it. The Lempel-Ziv algorithm can be either disabled (/MLN) or enabled (/ML1). When enabled it searchs for all matches using a relatively fast hash-table, so there is no need in gradations by compression speed. The fixup packing method can be set to [N]one, level 1 end level 2; fixups packed using Level 1 are recognized by any OS/2 version above 2.x; however level 2 compressed fixups will work only in OS/2 Warp 3.0 with (fixpack #17 (I believe)) and above (Warp 4.0 too). Note that when /MF1 or /MF2 is in use, the /U{+|-} option is ignored - module is always unpacked first. /N(B|L|A|+|-) [N]E executables: convert into LX (+) or reject (-) modules that are [B]ound, not [L]FN-aware or [A]ll. For more information about [B] and [L] option see the 'Features' section above. For example, the /NA- option will instruct lxLite not to convert NE files into LX, the /NA+ will instruct to convert always; the /NA-LB+ will instruct lxLite to convert ONLY non-[L]FN-aware and [B]ound executables, the /NA+LB- will instruct lxLite to convert [A]ll except non-[L]FN-aware and [B]ound executables. /O(X|D|S|A|+|-){:%} [O]utput e[X]tra/[D]ebug/[S]tub data into an external file; filename is determined by applying mask % onto original filename. Data is written [A]lways in the A+ state and only when removed in the A- state. For example, the /OD:*.$d$ switch will have effect on the TEST.EXE executable which contains debug info only when you choose to discard it and will place it into the file TEST.$d$. /P{+|-} Enable (+) or disable (-) pause before each file. The program shows the name of file which will be processed and offers a choice to continue or to abort. /Q{+|-} Query all configuration options. Basically it simply types a colored version of lxLite.cfg file through a MORE-style filter :-) All other options on the command line (if any) are ignored. /R{+|-} Enable (+) or disable (-) [R]ecursive file search through subdirectories. /S{+|-} Show (+) or don`t show (-) configuration in effect. This is useful for examining which settings are stored into .CFG file, especially for linked configurations (see below). For example lxLite /Cdefault /S will show the default settings. /T{:%} Use specified file as new DOS stub. DOS stub is (usualy) a tiny DOS .EXE file linked to OS/2`s module which is typicaly used to type an error message in the case if the executable is not run from DOS command line. Usually this looks like: This is an OS/2 executable module Along with lxLite are enclosed two stubs: stub_min.bin and stub_vdm.bin. First is the standard `type-error-and-exit` type, but it is slightly smaller than usual stubs used by various linkers. The second is an stub which starts a new OS/2 session and runs program from it again. If OS/2 is not detected it types the same error message and exits. The default for stub_vdm.bin is to let OS/2 decide the type of your executable itself. Alternatively, you can specify the type of session to be started by stub_vdm.bin. For this you need any hex editor - find the pattern `SesType->' in stub and replace the byte that comes after arrow (->) by needed session type. OS/2 recognizes next session types:  00 - OS/2 session manager determines type (default)  01 - OS/2 full-screen session  02 - OS/2 windowed session  03 - PM application  04 - VDM full-screen session  07 - VDM windowed session You can use stubs to do some neat tricks. Say you have two executables: ZIP for OS/2 and ZIP for DOS (I mean GNU ZIP, not PKZIP). They offer the same interface, does the same thing and share the same name. To avoid conflicts (and avoid placing them in different directories) you can link them both together into one EXE file which can be ran either from DOS or OS/2 mode. This can be achieved by following command line: lxLite /t:dos\zip.exe os2\zip.exe If stub size is bigger than certain threshold size (default - 1024 bytes) it will not be replaced. This is done since stubs of bigger size usualy does something useful (for example, this can be already an 'dual-mode' executable). It is useful for batch conversions and not too useful when you do tricks like described above: so you can wish to change this threshold value to zero. This can be achieved using the /Z switch (see below for details). /U{+|-} Enable (+) or disable (-) unpacking file before packing. lxLite know how to unpack any of two packing methods described, so default option state is enabled. Disable it only when compression time savings are more important than disk space savings. This option is ignored (and file is anyway unpacked) when /MF2 packing is enabled. /V[{0123OCRNMPEF}{+|-}] [V]erbose (show a lot of file information). This is a switch for curious ones :-) It has different levels of verbosity, you can choose which kind of information to include in overall output. For example: /V0-12+3-O+. Here is an detailed description of what each key shows:  0 Show basical information about executable: - module type - required CPU - module version - page size (on Intel platform always 4096 :-) - page shift - object count - resource count - imported entries count - debug info size - start object and EIP - stack object and ESP - module name - module description  1 - OS required to run the executable (always OS/2 :-) - Number of pages present in file - Fixup table overall size - Fixup table overall CRC - Resident portion of header size - Resident portion of header CRC - Automatical data object (valid only for 16-bit executables) - Number of preloaded pages - Additional stack size (has no effect in LX files) - Heap size (extra auto-data-object size; has no effect in LX files)  2 - Uncompressed Page data offset (relative to LX header) - Compressed data offset (relative to LX header) - Page fixup table offset (relative to LX header) - Fixup table offset (relative to LX header) - Imported modules table offset (relative to LX header) - Debug Info data offset (absolute)  3 - Object Table offset (relative to LX header) - Resource Table offset (relative to LX header) - Object Page Map Table offset (relative to LX header) - Module Directives Table offset (relative to LX header) - Non-resident name table offset (relative to LX header) - Non-resident name table size - Imported procedures table offset (relative to LX header) - Entry points table offset (relative to LX header)  O Show object info (i.e. information about objects contained in file). Output looks as follows: ## - Base --- Size --R-W-E-Res-Dis-Shr-Pre-Inv-Swp-Rsd-Loc-A16-32B-Cnf-IOP- 1 00010000 00001000 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y ## Object`s ordinal number Base Object`s base address, i.e. linear address at which it can be placed without applying self-addressing fixups Size Size of the object Further follows object`s flags which describe different attributes of object: - R - Object is readable - W - Object is writable - E - Object is executable - Res - Object is resource - Dis - Object is discardable - Shr - Object is shared among instances (DLLs only) - Pre - Object must be preloaded (this doesn`t work as far as I know) - Inv - Object is invalid - Swp - Object is swappable - Rsd - Object is resident (for ring 0 drivers only, AFAIK) - Loc - Object can be long-term locked (drivers only) - A16 - Alias16, object has an alias in 16:16 format - 32B - Object is 32-bit - Cnf - Object is code-conforming (16-bit drivers only, never seen it) - IOP - I/O priviledge. Object is authorised to access I/O ports.  C Object [C]ontents: show pages which makes object. This key enforces /VO. Output looks something like: ++- Index --+ FileOffs + Size + Attribute + + 00000001 + 00012340 + 0123 + LZ-packed + Index Page number in executable (absolute, not relative) FileOffs Offset of page data in file (absolute) Size Size of page data in file Attribute Page attribute: Valid An valid unpacked page RL-packed Compressed using Run-Length encoding (EXEPACK) Invalid Page is invalid Zeroed Page must be zeroed Range ???, no info, never seen one LZ-packed Compressed using Lempel-Ziv encoding (EXEPACK2)  R [R]esident Names Table: This is an table which usually contains all exported by name procedures. First entry always contains module name. Display format: + Indx + Name ---------------------------------------------- | 0000 | TCPIPDLL | 0001 | _dn_skipname | 0002 | _res_query | 0003 | _writev [.....................] + 006F + _gethostent Indx This is the index into the Module Entry Table which describes the actual address of routine Name The name of routine as it is imported into other programs.  N [N]on-Resident Name Table: This is an table which contains miscelaneous entry points which are not exported. First entry contains module description (if defined). Display format is the same as above.  M Imported [M]odule Names Table: This table contains names of all external dynamic-link libraries which uses current module. Display format: + Indx + Offs + Name --------------------------------------- | 0001 | 0000 | SO32DLL | 0002 | 0008 | TCP32DLL | 0003 | 0011 | so32dll | 0004 | 0019 | tcp32dll | 0005 | 0022 | DOSCALLS | 0006 | 002B | NLS | 0007 | 002F | MSG + 0008 + 0033 + setloc1 Indx Index into the module names table; This is often used in fixup records although lxLite resolve such references automatically and shows directly entry name. Offs Offset in the table = sum of lengths of all previous names. This is not used for Module Names Table but is used for Procedure Names Table which is displayed in similar format. Name The name of entry.  P Imported [P]rocedure Names Table: This table contains names of all external procedures which are imported by name. Display format is similar to Module Names Table.  E Module Entry Table: This is an table which defines some entry points into the current module; not neccessarily all entry points are defined here: only those which are exported MUST be defined here. Here is an sample display: + Indx + Entry Type + Entry Attributes --------------------- | 0005 | 0:32 | 1:00000000, Exported, Shared Data | 000B | 0:32 | 1:00008C90, Exported, Shared Data | 000C | 0:32 | 1:00008FB4, Exported, Shared Data | 002B | 16:16 | 4:02EC, Exported, Shared Data | 002E | 0:32 | 1:00009468, Exported, Shared Data + 0056 + 0:32 + 1:00001448, Exported, Shared Data Indx Index into the entry table. Entry table is always sequential, and all 'holes' between indices are filled with 'unused' entry points (for example, entry point index 10 cannot follow index 5: there must be entries 6,7,8,9 between them marked as 'unused'). lxLite doesn`t show 'unused' entries since this is unuseful; however they are there, just for your information. Entry Type Type of entry point. Entry points can be located in different segments (16-bit, 32-bit, it can be an Call Gate etc), so OS/2 needs a flag which will describe how to handle each entry point. There are also "forwarders" - fake entry points into the module which are in fact redirected into another module. For example, PMWIN.DLL, PMGPI.DLL and many other DLLs are simply a bunch of forwarders which all points to PMMERGE.DLL. Entry Attributes These depends of the entry type. For example, 0:32 entries has Object:Offset32 attribute, 16:16 entries have Object:Offset16 attribute, forwarders have attributes which describe to which module and which procedure to redirect this entry etc.  F [F]ixup table. This is useful, I think, only for me and, may be, for those who write compilers :-) Display format: + Object index: 1 Page index: 1 Absolute page: 1 | 32-bit relative offset of import SETLOC1.4 | 045C 0494 04B8 | 32-bit relative offset of import SETLOC1.5 | 035F 0CBA [.....................] + Object index: 1 Page index: 2 Absolute page: 2 | 32-bit relative offset of import SETLOC1.4 | 02B6 0328 0354 090E [.....................] + Object index: 1 Page index: 42 Absolute page: 42 | 32-bit relative offset of import DOSCALLS.256(DosSetFilePtr) | 066F 0C5D 0CD5 | 32-bit relative offset of import DOSCALLS.272(DosSetFileSize) | 0CB2 | 32-bit relative offset of import DOSCALLS.273(DosOpen) | 0B9D [.....................] Imports by ordinals are handled in a special way: lxLite has a resource table which contains information which allows lxLite to transform MODULE:ORDINAL form into an MODULE:NAME pair. By default lxLite contains a list of ordinals for all base OS/2 DLL`s, but if you want to add your own or if you need something special, you can add your module entries to lxLite.rc file in the API subdirectory and then to re-attach resources to lxLite (using Resource Compiler). /W(W|S|+|-) [W]rite (+) or [S]imulate writing of resulting file. In the /WW- state lxLite will do nothing (useful for /V option); in the /WS+ state lxLite will even display compression ratio, but won`t alter the module file on disk. Useful for /V{...} switch, but also can be useful for debugging your options. /X{+|-} e[X]pand (+) or pack (-) given files. Use this switch to decompress files. lxLite can decompress files which has been compressed by itself as well as by other programs which uses standard methods (i.e. Resource Compiler, LINK386, REPACK). It is NOT identical to /c:Unpack option. /Y[U|X|B|C|D]{?} auto-repl[Y] '?' on one of questions:  file in [U]se /Answer: [R]eplace, [S]kip, [A]bort/  [D]ebug info in file /Answer: [D]iscard, [L]eave, [S]kip, [A]bort/  e[X]tra data in file /[D]iscard, [L]eave, [S]kip, [A]bort/  [B]ackup file exists /[O]verwrite, [N]o backup, [S]kip, [A]bort/  [C]onfirmation on /P+ /[P]rocess, [S]kip, [A]bort/ If reply (?) is missing, lxLite will ask you interactively each time. When lxLite asks you a question, you can press Alt+letter which will set the default answer for all following similar questions. /Z{:#} This option will set the `threshold` for lxLite to help him determine when stub is a `dummy` one and when it is a functional program. There are a number of programs (for example, \os2\xdfloppy.exe) which runs both under DOS and OS/2 - in such programs DOS executable is implemented into OS/2`s LX as a DOS stub. By default lxLite considers all stubs bigger than 1024 bytes as functional programs, and therefore for such executables the /T{:#} option has no effect. If you want stub to be always replaced, use the /Z option. If you want to disable the /T option, use /Z-1. /?,/H Show a brief help. This is useful when you forget a particular switch from all that list :-) ──────────────────────────────────────────────────────────────────────────────── Title page | Introduction | Features | Configuration file | Error messages | Bugs and limitations | Thanks... | Utility Pack | Author info ═══ 1.11. Thanks ═══ Thanks to: Dmitry Goldobin who digged from OS2LDR information regarding /EXEPACK:2 packing method; the idea about lxLite was born when I was looking this; Rinat Sadretinow who gave me some ideas and informed me about some enhacements in OS/2 v4.0 regarding LX modules; Ilfak Guilfanov who gave me the information about new type of chained fixups in LX modules which appeared in OS/2 v4.0. I also would thank Herwig Bauernfeind who contributed to German translation of the documentation; Alas the link between us is very slow, so German docs are almost always little out of date :-) Sorry, I cannot do nothing with it. Here is a paragraph written completely by Herwig: Translator As I really was very happy about Andys program, I asked whether he would like a German translation of the documentation of version 1.01. Well, some things sound a bit 'bumpy', but first of all, I am doing this as a hobby only, secondly I am not professional programmer. I hope, it will help anyway. You can reach me by email (although this is quite useless, as I contributed the translation only): FIDOnet: Herwig Bauernfeind, 2:312/5.35 InterNet: H_BFD@fidonet.at (does not work reliably by now) ──────────────────────────────────────────────────────────────────────────────── Title page | Introduction | Features | Command-line switches | Configuration file | Error messages | Bugs and limitations | Utility Pack | Author info ═══ 1.12. lxLite utility pack ═══ Abstract Some time after releasing version 1.01 of lxLite (i.e. 1.0.1) (and some time before :-) I wrote some simple command-line utilites which greatly simplified my life. Because apart from lxLite they don`t present nothing interesting, I included them here for you to get them along with lxlite :-) unLock unLock is a simple utility which allows to `unlock` application executables which is currently in use. Normally when an executable is loaded by OS/2 its file is open with a deny-write sharing mode. This is done because LX format structure is designed not to swap out unused pages in executables each time when they aren`t needed anymore, but rather to discard them. When discarded page is needed OS/2 simply reads it again from executable. However, there is still a way to replace executables `on-the-fly` even if they are currently running. There is an so-called `well-known undocumented` function (which in fact means that it won`t be neccesarily supported in future versions of OS/2) which allow to disable sharing protection on such files. Before doing that OS/2 reads entire executable in swap file, then page swapping is done as with usual memory. If you`ll `unlock` many running executables at the same time you can notice an increase in swap file size. So, this is just an temporary work-around, you have better to reboot after doing all neccesary things on former locked files. The command-line format of unLock is much like lxLite`s, except that it have much less options :-) /R{+|-} [R]ecursive (+) file search through subdirectories. unLock will recursively search any directories which is located below the directory of given filemask. If multiple masks are given multiple recursive searchs will be performed. /P{+|-} Enable (+) or disable (-) pause before each file. Before each file unLock will ask you whenever you really want to unlock the file. /V{+|-} Verbose (show additional information). If verbose option is disabled (/V-) only those messages are left on screen which displays critical messages (i.e. errors), otherwise after each filename unLock shows the result of unlock operation - 'unlocked' or 'sharing violation'. Note that unLock CANNOT unlock files which are locked in some other way than executbles. /?,/H Show a short help screen noEA As you probably know :-) many (in fact a lot) of files have EAs (extended attributes), but does not need them. In fact the only thing which REALLY needs extended attributes is your Desktop\ directory. All other files can or can not have extended attributes - the only thing that you can lose by removing those attributes is how that file will appear in WPS folder (size and icon). Other type of extended attributes is those used by REXX - any REXX program that you run at least once and which does not have ReadOnly attribute set have some K of extended attributes attached to it. This is the 'pre-compiled' text of the REXX program, so it will run faster with that attributes. However, if you don`t use the REXX script too often, you can remove extended attributes from file then to set the Read-Only attribute. Note that if you have not too many EAs (say the .TYPE and the .APPTYPE EAs) they will NOT occupy any disk space because of the wise HPFS structure. So to use noEA you MUST know what you`re doing and whenever you needs it (anyway, this is true for any other program :-). noEA can show a list of extended attribute names for the processed files or remove all of them. The command-line switches are much like in all other utilites: /R{+|-} [R]ecursive (+) file search through subdirectories. noEA will recursively search any directories which is located below the directory of given filemask. If multiple masks are given multiple recursive searchs will be performed. /P{+|-} Enable (+) or disable (-) pause before each file. noEA will ask for confirmation before each processed file. /V{+|-} Verbose (show EAs instead of removing them). When this switch is used noEA will display the EAs attached to processed file and will NOT remove them. /Y{+|-} Assume (+) on all queries affirmative responce. When noEA encounters an write-locked file it warns you about this. However, this can be annoying when doing automatical processing (i.e. calling noEA from batch files). You can force noEA to process any files it can by specifying this switch. /?,/H Show a short help screen chCase Some time ago I was finally bored of the annoying habbit of some programs to write their files in upper case. And not only contents (almost any program which changes config.sys tends to convert it all to upper case when I like it to be in lower case) but filenames also. So i started this little project as a problem-dedicated-and-easy-to-use replacement for REN command. The main ideology of chCase is to divide filename in some `parts` then to perform some case-conversions on each part apart :-) You can define `part separator` characters using /S"" option. By default chCase uses "." as `part separator`. I.e. filename chcase.is.a.great.prog will be divided into parts 'chcase', 'is', 'a', 'great' and 'prog'. Further you can tell chCase to convert first part to upper-case, second - to lower-case, third - to mixed format (i.e. first letter in uppercase and rest in lowercase) and so on. The available options are: /C{F|D}(L|U|M|A) Convert to [L]ower/[U]pper/[M]ixed/[A]s-is case. You can define multiple `case conversion actions` - first one will be applied on the first `part`; second - on the second `part` and so on. Last `action` will be used for any extra encountered `parts`, so if you`ll define only one option it will be applyed on all filename parts. Some examples: ┌─────────────────────────┬─────────────────────────┬─────────────────────────┐ │filename │command line │resulting filename │ ├─────────────────────────┼─────────────────────────┼─────────────────────────┤ │mY.Very.lOnG.fIlE.NamE │/culam my* │MY.very.lOnG.File.Name │ ├─────────────────────────┼─────────────────────────┼─────────────────────────┤ │just.an.example │/cml jus* │Just.an.example │ ├─────────────────────────┼─────────────────────────┼─────────────────────────┤ │leT.iT.bE │/cmla let* │Let.it.bE │ └─────────────────────────┴─────────────────────────┴─────────────────────────┘ /R{+|-} [R]ecursive (+) file search through subdirectories. chCase will recursively search any directories which are located below the directory of given filemask. If multiple masks are given multiple recursive searchs will be performed. /P{+|-} Enable (+) or disable (-) pause before each file. Before each file chCase will ask you whenever you really want to rename this file. The initial and final filenames are displayed. /S{%} Define separator character(s). You can use this switch in the case when you have some files which uses some other separators, for example space or underscore. Note that the /S switch is NOT additive i.e. any /S switch disables the action of precedent. Even "." is cleared by /S switch, so if you for example want to use as separators both "." and space " " you have to define them both in a single /S switch as follows: /S" ." Just some examples: ┌─────────────────────────┬─────────────────────────┬─────────────────────────┐ │filename │command line │resulting filename │ ├─────────────────────────┼─────────────────────────┼─────────────────────────┤ │Mary has a Little.Lamb │/cm /s" ." mar* │Mary Has A Little.Lamb │ ├─────────────────────────┼─────────────────────────┼─────────────────────────┤ │john_wAs_a_lItTle_lame │/cuml /s"_" │JOHN_Was_a_little_lame │ └─────────────────────────┴─────────────────────────┴─────────────────────────┘ /V{+|-} Verbose (show additional information). If you will specify /V- chcase will leave on screen only critical messages such as errors - all others will be cleared immediately after they succeeded. /?,/H Show a short help screen SysIcons This program can change system pointers. It is mainly an GUI interface to WinSetSystemPointer() function, so don`t expect too much :-) Anyway, it has some advanced features such as editing pointers (using OS/2 Icon Editor) and also allows you to choose the method for storing pointers - you can either store into INI file an reference to an external file (so you must not move or delete them) or to store the pointer image directly (so it will occupy space in INI file, but original files on disk can be deleted after this). The interface is quite simple; I`ll describe here only some features that you may not understand. The Icon Filename field displays the full name of pointer file which OS/2 uses at start-up to load currently selected system pointer. If pointer is stored directly into OS2.INI file it will say so. The "Store icon directly/Use file reference" field lets you choose the method which SysIcons will use to store icon reference into INI file. This will work only for those icons which you have changed AFTER setting this button. If "Store icon directly" button is active, you can load icons and then remove them - they will not be used by OS/2 at start-up. The "Change" button displays the standard file dialog and lets you choose another icon instead of highlighted. The "Load Set" button lets you load an entire pointer set instead of loading each file separately. Note that sysIcons use an different from "System Setup->Mouse->Pointers->Load set" method: it uses an plain text file with extension .SET which defines one or more pointer replacements; OS/2`s setup uses hard-coded filenames (i.e. ARROW.PTR will always be the default mouse pointer). The format of .SET file is as follows: ──────────────────────────────────────────────────────────────────────────────── ; Everything after an semicolon is ignored ; Use semicolons to include comments into .SET file ARROW arrow.ptr ; This statement defines the file ; containing the default mouse pointer TEXT text.ptr ; -//- the text-editing pointer WAIT wait.ptr ; -//- the WAIT mouse pointer SIZE ; Empty lines resets pointer to default value ; The SIZE pointer is valid only in OS/2 v2.x MOVE move.ptr ; This is mouse pointer when moving a window SIZENESW sizenesw.ptr ; arrow from North-East to South-West SIZENWSE sizenwse.ptr ; North-West to South-East SIZEWE sizewe.ptr ; West to East SIZENS sizens.ptr ; North to South APPLICATION applicat.ptr ; Default icon representing an application INFORMATION info.ptr ; The icon displayed in Information messages QUESTION question.ptr ; The icon displayed in Question messages ERROR error.ptr ; The icon displayed in Error messages WARNING warning.ptr ; The icon displayed in Warning messages ILLEGAL illegal.ptr ; The Illegal Action mouse pointer DEFFILE file.ptr ; The default icon representing a file (?) DEFFOLDER folder.ptr ; The default icon representing a folder (?) MULTFILE multfile.ptr ; Multiple-file selection icon (?) DEFPROGRAM program.ptr ; The default icon representing a program ──────────────────────────────────────────────────────────────────────────────── Along with SysIcons I supplied three sets of system pointers: two of my own design (although some of them I collected from miscelaneous sources) and one of an unknown author (sorry) but that I like most. Hope you like them :-) The "Edit" button stores pointer into a temporary file (if it is not a file reference) and launches Icon Editor. After Icon Editor ends the file is loaded back into INI file. The "Undo" button does what you expect :-) But if you moved the highlight bar after change, you cannot undo the change anymore. The "Default" button does what you expect: it changes pointer to its default shape. The "Quit" button is the coolest feature of my program: hope you like it :-) ──────────────────────────────────────────────────────────────────────────────── Title page | Introduction | Features | Command-line switches | Configuration file | Error messages | Bugs and limitations | Thanks... | Author info ═══ 1.13. whatsnew.txt ═══ ------------------------- lxLite revision history ------------------------- [;] Comment [*] Modified [+] Added feature [-] Removed feature [!] Bug fix 1.2.1 ----- 17-Aug-97 small bugfix [!] Improved handling of filenames with forward slashes instead of backslashes [!] (yet again :-() changed the 'already packed' detection algorithm. The problem with it is that lxLite does not put any kind of 'fingerprint' into processed files so I have to decide whenever it has been processed or not only by side effects. [*] Made noEA's output a bit quieter. Now without /V option noEA shows all file names in one line and with /V option noEA advances to next line only for those files that has EAs. [!] chCase is back now! I understood why chCase messed up filenames when codepage was 437 :-( Sorry to those who had to reformat their HD to get rid of messy filenames ;-( it is mostly IBM`s fault, not mine. This sometimes breaks HPFS's filename BSP tree and makes files totally unreachable, undeletable etc. 1.2.0 ----- 10-Jul-97 [!!!] Mega-bug fix :-) I caught a very serious error in lxLite. However, I`ve encountered it only on GNU C++ compiler executable when I tried to pack it using RLE (/c:ver2x) method, so it is not too probable that you seen it before :-) The problem was following: for some unknown reason the guys at IBM decided that whenever a packed page is bigger than 0xFFC bytes, it is an error. To understand this, I had to dig through the OS/2 kernel (whew!). So if the compression ratio for some page was really worse (this happens much seldom on EXEPACK2 (LZ) method since it packs better, and often on RLE method since it sucks), the page was simply missing at its memory location (!). In such cases a record is added to POPUPLOG.OS2, looking very unusual (no registers, no location etc). [!] noEA will not bomb out anymore when it tries to process a completely locked file (i.e. ea data. sf). [*] In some situations (very high ordinals in entry table) lxLite began to eat lots of memory, and this usually terminated with an out-of-swap-space trap :-( Fixed. 1.1.9 ----- 10-May-97 Upgrade for version 1.1.8 [*] lxLite is distributed now under GNU General Public License (GPL). [*] lxLite`s documentation is now in both .HTML and .INF format (the .INF book is converted for your convenience with HTML2IPF). [!] Oooooops! I`ve left a debug sequence in fixup packing section, so really fixups were packed ONLY at page N20! :-) [*] Added a little tolerance to minor (and even severe) bugs in fixip table which could lead lxLite to display an 'invalid fixup record' message. [*] More tolerance to incorrect debug information (exceeds executable, encountered on FASTECHO/2 1.46). [!] Yet again improved 'already-packed' modules detection :-) [+] Added the /C{+|-} option for those with a B/W monitors [+] Added the /CS{+|-} option for those who prefer writing to stdout. Actually lxLite isn`t entirely an stdOut program, it still uses VioXXX to do some things, notably get console width and height. You can put this option in the [default] section of config file to force lxLite always write to stdout. [+] Disabled the progress bar indicator when StdOut is redirected. Now you can use lxLite >alternateLogFile without getting much garbage. Try lxLite * | more :-) [!] Captain Nemo`s INI file (NEMO-OS2.INI) has a perfect NE executable structure :-))) so I added NEMO-OS2.INI to the list of excluded files. [+] Added ability to apply (/MFA{+|-}) fixups since some executables (observed on FASTECHO2.EXE - written using Borland C++ for OS/2) were linked without /BASE: linker flag which leads to slower loading times and bigger executables without need since executables are always loaded at 0x10000. This option work only for .EXEs. [*] Now the /V flag works *after* lxLite processes module, so you will see the *final* result of conversion, not the *original* module information. Of course, you can still see the original if you`ll disable all lxLite processing (the /C:info switch will do it for you). 1.1.8 ----- 01-Mar-97; well, its THE time for a new release :-) [!] Fixed a serious bug in run-length packing method: the kernel decompressor expects two zeros at the end of packed data and lxLite didn`t put them there. The bug is since first lxlite release, so if you previously encountered problems (especially using /C:Ver2x switch) you should try to re-pack damaged modules (lxLite will correctly unpack even "incorrect" modules, then will correctly pack them). Big thanks to Vallat Christophe for pointing out this bug. [+] Now to reply to any question you can instead of pressing simply [L]etter press +[L]etter which will set the default reply for all following similar questions. [+] Added the /MF3 fixup packing method which will find the best alternative for each page between /MF1 and /MF2. However this is a bit slow and does not give too much gain, so default is still /MF1. [!] Fixed a serious bug in /MF2 packing method. Lucky for you, previous version was not public. [*] Now you cannot proceed module along with displaying module structure (i.e. /V option has priority over any other). 1.1.8g ----- 15-Feb-97, a year from first public release :-) [+] Added some extra gain since now all fixed-up locations are filled with zeros before packing. For modules with pre-applied fixups this operation is not performed. [+] Added fixup packing method for Warp 4.0 (3.0 with fixpack #17) and above (/MF2). This option is still at beta-test stage, so use with care (by default it is disabled now). Anyway, this method has proven to be less effective sometimes than /MF1 with above correction. And note that on most executables this method will have absolutely no effect: it is primarily intended for DLLs. Also note that when fixup packing is enabled, the /U{+|-} option is ignored - module is always unpacked first. The /MF2 option is ignored for modules with pre-applied fixups (for example DOSCALL1.DLL). 1.1.8b ----- 25-Jan-97, my birthday :-) [;] WARNING: This is a PUBLIC BETA version; it still contains bugs, especially in NE->LX conversion routines. USE WITH CARE. I tested it for about a month, and found THREE executables on which lxLite fails to convert (i.e. didn`t convert right from NE format into LX): please avoid them: - OS2DASD.DMD with beta support for HPFS on removable drives (other versions converts OK): halt on reboot with a "Unable to operate your hard drive" message. - RESOURCE.SYS from Warp 4.0 GA: Trap 0D on first keypress after it is loaded. - ES1688.SYS driver for ESS-1688 soundcard; trap when loading. I do not understand why this is happening; everything seems ok, but something is wrong :-( That`s why I`m releasing this public beta version: PLEASE REPORT ME ANY CASES WHEN LXLITE FAILS. Contact information is available at the end of LXLITE.ENG file. [*] Changed configuration file format: now it is Unix-alike, i.e. configuration option is defined using square brakets, for example [default]; next lines are interpreted as command-line options that are loaded when loading specific section. [!] Fixed two bugs in NE fixups conversion routine: this possibly caused most of failures when converting NE modules before. [+] Added exclusions and additional-options-based-on-filemasks needed to entirely compress Watcom C subdirectory without losing functionality of any executable. [*] Added the /NR switch; now lxLite will fail to convert NE files that contains resources; use the /NR option with care, especially on DLLs since you must know what executables uses that DLL and which function (Dos16GetResource or Dos16GetResource2) they`re using to load resources. 1.1.7b ----- internal release [;] Now lxLite converts NE executables into LX. Uhhh! Lots`o`work done. Lots'o'things changed. Lots'o'options added. Some options has been renamed, some merged into one, so read at least following info before trying new version. [*] IMPORTANT: Now all options that can be followed by a string (i.e. file name, configuration ID) must have a semicolon before string, i.e. /C:default, /L:mylog etc. [*] IMPORTANT: I changed a lot of options to make them more mnemonic: The /D option now is called /E ([E]xclude); /E option has been renamed into /R ([R]ecursive); /R option has been added to /A option (which still works in old way (say /APS); you also can directly specify new page shift count i.e. /A:4; you can use them both ways i.e. /APS:4); [*] Changed a lot of internals so it it possible for some bugs to appear. [*] If you choose to load a specific configuration, and configuration file contains more than one line that matches that config ID, lxLite will load all such lines, not only the first as before, so you can split very long configurations into some number of lines. [*] Removed from configuration file options /C:failSafe, /C:fast, /C:fast2 because they`re useless: experience shows that executables packed with /C:default loads and works faster. [!] Increased stack space: small stack space is very like to cause all those strange crashes of lxLite on deep directory trees. [!] Some minor memory leaks has been fixed [+] Added functionality to VERBOSE mode: now you can specify what kind of information you want to see. lxLite can serve as an replacement for EXEMAP and EXEHDR programs :-) More detailed descrition you can find in documentaion (English only, the German docs refers to version 1.1.5). For displaying exported entry points, fixups and forwarders, lxLite now knows a lot of API functions by name. Today lxLite knows by name all documented API functions in all base OS/2 dynamic-link libraries. You can add your own - see the resources in API\ subdirectory. [+] When displaying long texts (i.e. /V{...} option, help text) lxLite will use a kind of 'MORE' prompt. [+] Bundles of entry points now are re-packed although seems that in most cases they are packed well. [+] Fixup records now are also re-packed, although in most cases they are already compressed. If you run lxLite on a previously packed file (with earlier versions) and you get some gain, it means that fixup records (or entry points bundles) has not been packed at the maximum possible level. If you got BIGGER files, please let me know :-) [!] Corrected a bug which leaded to loss of non-resident name table (usually it contains executable description) with a message 'LX file contains extra bytes' when it isn`t. [+] Improved a bit 'already-compressed' executables detection. [+] Added the /J option to change executable type: use it for converted NE drivers since NE drivers are marked as DLLs; LX drivers always must be marked as Device Drivers, otherwise they will not load successfully. [+] Added the ability to use some specific configuration options for filenames that matches specific filemask. For example, if in configuration file you`ll specify the entry: @a*z.c?$: /B this will enable backups for files that matches the "a*z.c?$" filemask, i.e. aaaz.cc$, abcdefgz.ca$ but not for the bcde.cc$. A side effect of this is that you can encounter a option syntax error in the middle of the process, not only at the start. [+] Improved a bit the /L option: now you can choose which types of events you want to log; be careful: now the log filename MUST BE SEPARATED BY A COLON from /L{...}, i.e. /L:"log file" [+] Improved the /B option: now you can choose to backup only in the cases when module contains e[X]tra or [D]ebug data. Also you can choose to place backups in a certain directory; for example with the /B:bak option lxLite will place all backed up files into the \BAK\ directory on the current drive, recreating the same directory structure as the original file was placed in. [*] The /G option has been merged with the /O option; the /G option now is gone. [+] Modified the /W option: in the /WS+ state lxLite will perform just like always, except that it won`t write output file (and will display compression rate too unlike in the /W- state). [*] lxLite utlity pack: version of utilites now will be the same as for lxLite. So all enclosed utilites (chCase, noEA etc) now have version 1.1.7 [*] Options in utilites changed according to changes in lxLite: recursive search changed from /E to /R etc. [+] ChCase: The option /C{...} has been extended: now you can define separate rules for [F]iles and for [D]irectories: The /CF{...} switch will define case conversion rules for [F]iles and /CD{...} switch will define them for [D]irectories. If used in old fashion (i.e. /C{...}) it will work both for files and directories. [!] Both chCase and lxLite when processing a file with no attributes (i.e. attrib -a-h-s-r) will set the Archive flag. [-] Removed ColMng from lxLite utility pack because of its usefulness and excessive complexity for most users :-) [+] Added/changed a whole lot of other things I don`t remember now. 1.1.6 ----- internal release [-] Removed sources from base distribution. The sources are still available on request (see docs for "how to contact" information). This was done since they grow in size very fast (they use some of my external libraries - a function-two from each) and not too much people really needs them. [!] Fixed a bug - the /GX{#} option worked only in /OX+ state [*] Improved a bit help on /O{G|D|X} option [!] Fixed a number of minor bugs in error-correction logic [*] Changed default option in unLock from /V+ to /V- [*] Changed default option in chCase from /V+ to /V- [*] Before unlocking file all utilites saves now file date/time; after unlocking they`re restoring date & time, although this is an overkill (?). 1.1.5 ----- 19-Jun-96 another bug fix :-) [!] AT LAST! The famous `cannot open configuration file` bug fixed :-) The problem was that CMD.EXE puts in environment the command line that you used to start lxLite AS-IS while 4OS2 replaced it by fully-qualified lxLite filename followed by its command-line parameters. I used it to compute lxLite`s source path; however program`s environment contains ANOTHER fully-qualified filename path which I use now :-) and which is ALWAYS fully-qualified. [+] Because nobody understands how the /G switch works (I got a lot of e-mail regarding this) I added a new switch: /O{X|D|S}{+|-}. If it is disabled (/O-, default state) the /G switch works as before, i.e. the data is written only if discarded from source file. If the /O+ option is used, the data is written always (if filemask is specified by /G option). [!] Fixed an non-serious bug in CRT.PAS - now lxLite works as expected even if it is redirected into a device other than CON (i.e. /dev/nul), not only into files or pipes. [+] After a lot of thougts I added into lxLite utility pack my first PM program for OS/2 - SysIcons. It is an simple program which allow you to change system pointers (including but not limiting to mouse pointers, as System Setup->Mouse->Pointer does). Also I included three of my best sets of pointers - one which I partially designed myself, partialy aquired from different sources, second is the B&W version of first and third (white gloves) which I got from somewhere and converted to B&W (because on my Cirrus Logic B&W pointers are supported by hardware and does not flicker). Sorry to the author of White Gloves set, but I lost original archive and copyright notice; I hope you`ll excuse me. [!] Improved a bit error checking; previous versions sometimes (seldom) failed on almost-good-exe-files (specifically GVPM.EXE which had one of non-mandatory internal table beyond the limits of EXE files which caused lxLite to fail with an runtime error). 1.1.4 ----- 14-Jun-96 minor fixes & additions [!] Fixed displaying the question about extra LX data - I forgot to add an carriage return after it. Also I removed the warning about the possibility that resulting file will become non-functional. [!] Fixed a stupid bug (sizeOf(F) instead of fileSize(F)) which sometimes forced lxLite to discard debug info even if you specify to leave it in resulting file. In such cases lxLite displayed that file has X bytes of extra data and the same amount of debug info. [+] Added an sub-option for /G[X|D|S]{#} - the /GX option now specifies the filemask for files where to store stubs (even if lxlite won`t remove them). [!] Fixed a minor bug in lxLite - when file was already processed but stored with debug info and you process it again and choose to discard debug info it refused to do it because `file was already processed`. [!] Fixed a serious bug - the /G option in version 1.1.3 DOES NOT DO WHAT YOU PRESUME :-) It stored garbage instead of debug/extra data. [*] The option /GX*.$x$ is used by default. This was done for those executables which failed to run after packing because the extra data has been stripped. Use COPY /B {file}.exe+{file}.x {newfile}.exe command to append extra LX data back - in most cases this will restore the functionality of LX files. Note that now lxLite leaves those *.$x$ files as garbage, so don`t forget to test the executable functionality and to delete them if executable still works. [*] Improved performance of ChCase - now when computed filename will be the same as initial file will be simply skipped. 1.1.3 ----- 28-May-96 fixes & changes [*] Modified lxLite to redraw its progress bar only when it really changes. This may improve its execution speed when running it in windowed sessions (however I don`t use them :-) [+] Added option /G[X|D] which specifies an file mask for files where to store the e[X]tra LX data and [D]ebug info when encountered and if user chooses to discard it. [+] The /S switch now displays the status of the /I switch also. This is done for those who don`t believe that it always works (you know who you are :-) [-] Removed the /O{#} option which has proven to be useless. [-] Removed the old /D{+|-} switch (debug info remove on/off). Now lxLite prompts the user if the debug info is encountered; however the default behavior is to discard debug info (/YDD) as before. Now /D switch have other meaning (see below). [+] Added (other) /D switch to set exclusion filemasks. Filemasks uses the same rule as OS/2 does (in fact, lxLite uses OS/2 API to do that). For example, /Dex*re.??e:*.zip:*.pas:*.obj will exclude these files from lxLite`s field of view. The default configuration now includes the [exclude] configuration which excludes all known executables on which packing cannot be performed (such as PMJPEG, Watcom C etc). Masks should be separated by ':'; the ',' and ';' symbols can be present in HPFS long filenames, so they aren`t taken into account. [+] The /Y switch is modified (expanded). Now you can specify answers for each type of possible questions separately. The /Y switch must be followed by a letter - ID of answered question, then a letter - what do you want answer to be to that question. The possible IDs for now are: ----------------------------------------------------------------------- Module is in [U]se (answers: [R]eplace, [S]kip or [A]bort); File contains [D]ebug info ([D]iscard, [L]eave, [S]kip or [A]bort); File contains e[X]tra data ([D]iscard, [L]eave, [S]kip or [A]bort); .[B]AK file already exists ([O]verwrite, [N]o backup, [S]kip or [A]bort); Confirmation (/P+) ([P]rocess, [S]kip or [A]bort); ----------------------------------------------------------------------- For example, the /YUR switch will instruct lxLite always to replace modules which are in use. The defaults are: /YBN /YDD and /YXD. [+] Added /L{#} switch to specify an [L]og file name. If no filename is specified, the log file will be created as lxLite.log in the same directory as lxLite.exe. The log file contains a list of processed files, their initial and final sizes, and also all problems (if any) which have been encountered when processing the file. 1.1.2 ----- 22-May-96 minor additions and changes [;] The BOXER for OS/2 APAR is closed now :-) At last I downloaded it from hobbes and it works packed absolutely without any problems. This is due to the effect of `overlayed data` for which support has been added in version 1.1.1. [+] Added an alternative [D]iscard choice when prompting for an action when data out of LX structure is detected. Some DLL`s (even from \OS2\DLL) seems to contain some garbage after end of LX file. [*] Changed memory allocation strategy - now memory manager allocate memory in 64K chunks which can fix the problem of slow performance on low-memory machines (8mb and less) when processing large files (i.e. TUTORMRI.DLL). I can`t check this - please mail me if it works. [*] Changed backup strategy - now lxLite always make .BAK file even if backups are disabled (/B-). If operation succeeds and backups are disabled it is then removed. No more `$lxlite$.tmp` file. [*] Now lxLite says '(very!)' in phrase 'It is (very!) possible that resulting file will be non-functional' only if the size of data out of LX structure is bigger than 256 bytes (this can be changed by /O{#} option /see below/). If overlay size is bigger and /Y+ switch is specified file is skipped otherwise overlayed data is [D]iscarded. [+] Added /O{#} option which allows to specify threshold size for overlay data. All overlays less than this value are discarded with /Y+ switch. For more information please refer to english documentation. [*] Modified defaults - now lxLite by default doesn`t pack using run-length method AT ALL (i.e. as if you specified /MRN switch). That is because I hadn`t found even a case when using this method lxLite produced packed files by at least A BYTE less in size. Instead it compresses now A LOT faster. 1.1.1 ----- 07-May-96 bugfix [!] noEA and chCase v1.0.0 does not work on directories - they says that the module is in use. Version 1.0.1 is fixed. [!] lxLite, noEA, unLock and chCase leaves sometimes garbage on screen especially when processing long subdirectories. Fixed. 1.1.0 ----- 06-May-96 some additions + minor bugfix [*] Change in version numeration: Now version numbers conforms to GNU standards. The first is major release number; second is minor release ordinal and third is incremented only on bug-fixes. [!] Now lxLite checks for a valid MZ header in DOS executable stub. [!] Fixed: lxLite stops sometimes after trying to `pack` locked files (i.e. swapper.dat) with a runtime error. The cause was a bug (sic!) in DosEnumAttribute - when you issue it on a locked file it trashes memory AFTER buffer passed to it (in my cause this trashed the stack). [+] Now lxLite understands quoted long complex filenames on the command line like most OS/2 commands do. I.e. you can write lxLite "my own subdirectory\my executable file.exe" /cmax [+] Added option /Q - query list of configurations. [+] Added option /I{+|-} - Run/don`t run at idle priority [+] Added detection of `overlayed` executables (usually from Watcom) - for more information see English documentation. [+] Added `lxLite utility pack` which now consists of: - unLock which allow to unlock `locked` executables - chCase which allow to automatically change case of individual filenames as well as of groups of filenames - colMng is a simple utility to manage your WPS color palettes - noEA which allow to remove extended attributes from files and directories 1.01 ---- 23-Feb-96 minor bugfix [!] Bugfix :-) in v1.00 docs I erroneously stated that Alice was born at 13-Feb-96; however the real date is 12-Feb-1996 :-) [!] Now lxLite preserves not only timestamp but also file attributes. The version 1.00 erroneously stated that file is used by another process in the case lxLite failed to access it because of read-only or system attribute. [!] Fixed: lxLite preserves now extended attributes of the file. Sometimes EAs are useful, although mostly occupies disk space :-) [!] Fixed: lxLite now COPIES file into/from backup copies instead of renaming them: this caused the WorkPlace Shell to track such operations and to change the `program filename` field in program object. [*] Now /R{#} option can be used to re-align pages even on 1 (byte) boundary. This will get some extra bytes, however LINK386 does not allow this value to be less than 4 (but OS/2 eats it) - use at your own risk. [-] Removed `Switch-to-foreground-when-asking` feature. This was implemented rather as a lab work than a useful feature :-) On the other hand, the version with this feature must use PMSHAPI.DLL which is not always available (in particular when booting from OS/2 repair/installation diskettes). 1.00 ---- 15-Feb-96 first release version [!] When an invalid page is encountered don`t exit with an error but check first if this page is used. (Encountered on npswpsri.dll 1.81). This is an invalid executable; however error is not fatal because page isn`t used and OS/2 loads that DLL without problems. [!] Now lxLite keeps and restores original executable timestamp. [!] Fixed an error when OS/2 locks up on some DOS executables because it contained a 0 at offset 3Ch in DOS EXE header. [*] Changed format of .CFG file. Now it is a plain ASCII text file. For details refer to documentation, section about options. [-] Removed /D# option - use a text editor to add new cfgs. [+] Added /D{+|-} option allowing to remove debug information. [+] Added ability to recognize files packed with ABSOLUTELY THE SAME options, so lxLite will not proceed the same file twice. "The same" means that files will be recognized as packed ONLY if it has been processed with the same switch(-es) which influence resulting file size. Use /F+ (see below) switch to bypass this detection if you want to process file anyway - for example if it has been already packed, but not so good as it can be, i.e. by LINK386 or REPACK. [+] Added /F{+|-} option allowing to force repacking even if lxLite thinks that it is not needed. Use to bypass autodetection (`already processed' message). [+] Added /T{#} option allowing to replace DOS stubs. Use /T alone to completely remove DOS stubs - useful for DLLs `cause they cannot be run from DOS session at all. [+] Added ability to replace even USED! i.e. `active` .DLL`s and executables. Now you can repack entire \os2\*\*.* subdirectory without having to do a clean boot. Note that you better reboot after such operations because OS/2 will throw away all its internal cache buffers for this module and it (i.e. its old copy) will be kept entirely in memory/swapfile. [+] Now lxLite runs at the idle:16 priority so it won`t overload your CPU. [+] Now when lxLite encounters a problem to which he needs your answer he brings itself to the foreground. The only thing to say about it is: because of that lxLite uses now PMSHAPI & PMWIN.DLL, so it most likely will not run under T-Shell. Because of that there are TWO supplied versions of lxLite: lxLite-T.exe and lxLite.exe. Delete first if you will not need lxLite with a clean boot. [+] Added /Z{#} option which defines the threshold for lxLite to separate programs with `functional` stubs such as dual-mode executables from 'dummy' stubs. Default size is 1024 bytes, i.e. on all executables with stub size bigger than 1024 bytes the /T{#} option will have no effect. 0.99b ----- 07-Feb-96 beta-test version [;] What`s new? Nice question :-) ═══ 2. External links ═══ This chapter contains all external links referenced in this book - either link is an Unified Resource Locator (URL) or simply to a local file which is not a part of this book. ═══ 2.1. http://hobbes.nmsu.edu ═══ The link you selected points to an external resource. Click the URL below to launch IBM Web Explorer http://hobbes.nmsu.edu ═══ 2.2. http://www.anybrowser.org/campaign/ ═══ The link you selected points to an external resource. Click the URL below to launch IBM Web Explorer http://www.anybrowser.org/campaign/ ═══ 2.3. mailto:bit@freya.etu.ru ═══ The link you selected points to an external resource. Click the URL below to launch IBM Web Explorer mailto:bit@freya.etu.ru